52 lines
2.3 KiB
JavaScript
52 lines
2.3 KiB
JavaScript
// [DEF:frontend.src.components.llm.__tests__.provider_config_integration:Module]
|
|
// @TIER: STANDARD
|
|
// @SEMANTICS: llm, provider-config, integration-test, edit-flow, delete-flow
|
|
// @PURPOSE: Protect edit and delete interaction contracts in LLM provider settings UI.
|
|
// @LAYER: UI Tests
|
|
// @RELATION: VERIFIES -> frontend/src/components/llm/ProviderConfig.svelte
|
|
// @INVARIANT: Edit action keeps explicit click handler and opens normalized edit form.
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
|
|
const COMPONENT_PATH = path.resolve(
|
|
process.cwd(),
|
|
'src/components/llm/ProviderConfig.svelte',
|
|
);
|
|
|
|
// [DEF:provider_config_edit_contract_tests:Function]
|
|
// @TIER: STANDARD
|
|
// @PURPOSE: Validate edit and delete handler wiring plus normalized edit form state mapping.
|
|
// @PRE: ProviderConfig component source exists in expected path.
|
|
// @POST: Contract checks ensure edit click cannot degrade into no-op flow.
|
|
describe('ProviderConfig edit interaction contract', () => {
|
|
it('keeps explicit edit click handler with guarded button semantics', () => {
|
|
const source = fs.readFileSync(COMPONENT_PATH, 'utf-8');
|
|
|
|
expect(source).toContain('type="button"');
|
|
expect(source).toContain('onclick={() => handleEdit(provider)}');
|
|
});
|
|
|
|
it('normalizes provider payload into editable form shape', () => {
|
|
const source = fs.readFileSync(COMPONENT_PATH, 'utf-8');
|
|
|
|
expect(source).toContain('formData = {');
|
|
expect(source).toContain('name: provider?.name ?? ""');
|
|
expect(source).toContain('provider_type: provider?.provider_type ?? "openai"');
|
|
expect(source).toContain('default_model: provider?.default_model ?? "gpt-4o"');
|
|
expect(source).toContain('showForm = true;');
|
|
});
|
|
|
|
it('keeps explicit delete flow with confirmation and delete request', () => {
|
|
const source = fs.readFileSync(COMPONENT_PATH, 'utf-8');
|
|
|
|
expect(source).toContain('async function handleDelete(provider)');
|
|
expect(source).toContain('$t.llm.delete_confirm.replace("{name}", provider.name || provider.id)');
|
|
expect(source).toContain('await requestApi(`/llm/providers/${provider.id}`, "DELETE")');
|
|
expect(source).toContain('onclick={() => handleDelete(provider)}');
|
|
});
|
|
});
|
|
// [/DEF:provider_config_edit_contract_tests:Function]
|
|
// [/DEF:frontend.src.components.llm.__tests__.provider_config_integration:Module]
|