story-ui-job-list-error: fix fake-green test — extract real JobErrorLine component
Reviewer flagged: tests rendered __mocks__/JobErrorDisplay.svelte (a test-only duplicate), so removing lines 273-274 from +page.svelte left every test green. Fix (option B): extract error block into src/lib/components/JobErrorLine.svelte, import it from +page.svelte, move scoped CSS into the component, delete the mock, and point the test at the real component. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
c20f0d5f22
commit
559eef7180
@@ -11,3 +11,16 @@
|
|||||||
{#if job.status === 'failed' && job.error}
|
{#if job.status === 'failed' && job.error}
|
||||||
<div class="recent-err-line" title={job.error}>{job.error}</div>
|
<div class="recent-err-line" title={job.error}>{job.error}</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.recent-err-line {
|
||||||
|
font-size: 11.5px;
|
||||||
|
color: var(--error-text);
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
margin-top: 3px;
|
||||||
|
font-family: var(--font-mono);
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
+2
-14
@@ -5,6 +5,7 @@
|
|||||||
import SourceIcon from '$lib/components/SourceIcon.svelte';
|
import SourceIcon from '$lib/components/SourceIcon.svelte';
|
||||||
import Waveform from '$lib/components/Waveform.svelte';
|
import Waveform from '$lib/components/Waveform.svelte';
|
||||||
import RecordButton from '$lib/components/RecordButton.svelte';
|
import RecordButton from '$lib/components/RecordButton.svelte';
|
||||||
|
import JobErrorLine from '$lib/components/JobErrorLine.svelte';
|
||||||
import { accent } from '$lib/accent.js';
|
import { accent } from '$lib/accent.js';
|
||||||
|
|
||||||
const ACCENT = $derived($accent.value);
|
const ACCENT = $derived($accent.value);
|
||||||
@@ -270,9 +271,7 @@
|
|||||||
<div class="recent-text">
|
<div class="recent-text">
|
||||||
<div class="recent-title">{job.title || job.source}</div>
|
<div class="recent-title">{job.title || job.source}</div>
|
||||||
<div class="recent-meta mono">{jobMeta(job)}</div>
|
<div class="recent-meta mono">{jobMeta(job)}</div>
|
||||||
{#if job.status === 'failed' && job.error}
|
<JobErrorLine {job} />
|
||||||
<div class="recent-err-line" title={job.error}>{job.error}</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
{#if job.status !== 'done' && job.status !== 'failed' && job.status !== 'cancelled'}
|
{#if job.status !== 'done' && job.status !== 'failed' && job.status !== 'cancelled'}
|
||||||
<div class="recent-progress mono" style="color: {ACCENT}">
|
<div class="recent-progress mono" style="color: {ACCENT}">
|
||||||
@@ -568,17 +567,6 @@
|
|||||||
color: var(--error-text);
|
color: var(--error-text);
|
||||||
}
|
}
|
||||||
|
|
||||||
.recent-err-line {
|
|
||||||
font-size: 11.5px;
|
|
||||||
color: var(--error-text);
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
margin-top: 3px;
|
|
||||||
font-family: var(--font-mono);
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Utilities ─────────────────────────────────────────── */
|
/* ── Utilities ─────────────────────────────────────────── */
|
||||||
.sr-only {
|
.sr-only {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { describe, it, expect } from 'vitest';
|
import { describe, it, expect } from 'vitest';
|
||||||
import { render } from 'svelte/server';
|
import { render } from 'svelte/server';
|
||||||
import type { Job, AudioMode, JobStatus } from '$lib/types.js';
|
import type { Job } from '$lib/types.js';
|
||||||
import JobErrorDisplay from './__mocks__/JobErrorDisplay.svelte';
|
import JobErrorLine from '$lib/components/JobErrorLine.svelte';
|
||||||
|
|
||||||
// Factory: minimal Job shape needed by the error display logic
|
// Factory: minimal Job shape needed by the error display logic
|
||||||
function makeJob(overrides: Partial<Job> = {}): Job {
|
function makeJob(overrides: Partial<Job> = {}): Job {
|
||||||
@@ -27,7 +27,7 @@ function makeJob(overrides: Partial<Job> = {}): Job {
|
|||||||
|
|
||||||
describe('Job list error display', () => {
|
describe('Job list error display', () => {
|
||||||
it('renders error text for a failed job with error message', () => {
|
it('renders error text for a failed job with error message', () => {
|
||||||
const result = render(JobErrorDisplay, {
|
const result = render(JobErrorLine, {
|
||||||
props: {
|
props: {
|
||||||
job: makeJob({ status: 'failed', error: 'simulated transcription failure' }),
|
job: makeJob({ status: 'failed', error: 'simulated transcription failure' }),
|
||||||
},
|
},
|
||||||
@@ -38,7 +38,7 @@ describe('Job list error display', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('renders nothing when job status is done with null error', () => {
|
it('renders nothing when job status is done with null error', () => {
|
||||||
const result = render(JobErrorDisplay, {
|
const result = render(JobErrorLine, {
|
||||||
props: {
|
props: {
|
||||||
job: makeJob({ status: 'done', error: null }),
|
job: makeJob({ status: 'done', error: null }),
|
||||||
},
|
},
|
||||||
@@ -51,7 +51,7 @@ describe('Job list error display', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('renders nothing when job status is failed but error is null', () => {
|
it('renders nothing when job status is failed but error is null', () => {
|
||||||
const result = render(JobErrorDisplay, {
|
const result = render(JobErrorLine, {
|
||||||
props: {
|
props: {
|
||||||
job: makeJob({ status: 'failed', error: null }),
|
job: makeJob({ status: 'failed', error: null }),
|
||||||
},
|
},
|
||||||
@@ -62,7 +62,7 @@ describe('Job list error display', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('renders nothing when job has error but status is not failed', () => {
|
it('renders nothing when job has error but status is not failed', () => {
|
||||||
const result = render(JobErrorDisplay, {
|
const result = render(JobErrorLine, {
|
||||||
props: {
|
props: {
|
||||||
job: makeJob({ status: 'pending', error: 'some error' }),
|
job: makeJob({ status: 'pending', error: 'some error' }),
|
||||||
},
|
},
|
||||||
@@ -74,7 +74,7 @@ describe('Job list error display', () => {
|
|||||||
|
|
||||||
it('sets title attribute on error element to full error text', () => {
|
it('sets title attribute on error element to full error text', () => {
|
||||||
const errMsg = 'detailed error description for tooltip';
|
const errMsg = 'detailed error description for tooltip';
|
||||||
const result = render(JobErrorDisplay, {
|
const result = render(JobErrorLine, {
|
||||||
props: {
|
props: {
|
||||||
job: makeJob({ status: 'failed', error: errMsg }),
|
job: makeJob({ status: 'failed', error: errMsg }),
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user