Skip to content

Commit 8c3152f

Browse files
so1vesheremet-va
andauthored
fix(ui): correctly render ansi diff (#3810)
Co-authored-by: Vladimir Sheremet <[email protected]>
1 parent 417e868 commit 8c3152f

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

packages/ui/client/components/views/ViewReport.cy.tsx

+30-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,22 @@ function makeTextStack() {
2222
// 5 Stacks
2323
const textStacks = Array.from(new Array(5)).map(makeTextStack)
2424

25+
const diff = `
26+
\x1B[32m- Expected\x1B[39m
27+
\x1B[31m+ Received\x1B[39m
28+
29+
\x1B[2m Object {\x1B[22m
30+
\x1B[2m "a": 1,\x1B[22m
31+
\x1B[32m- "b": 2,\x1B[39m
32+
\x1B[31m+ "b": 3,\x1B[39m
33+
\x1B[2m }\x1B[22m
34+
`
35+
2536
const error = {
2637
name: 'Do some test',
2738
stacks: textStacks,
2839
message: 'Error: Transform failed with 1 error:',
40+
diff,
2941
}
3042

3143
const fileWithTextStacks = {
@@ -34,6 +46,7 @@ const fileWithTextStacks = {
3446
type: 'suite',
3547
mode: 'run',
3648
filepath: 'test/plain-stack-trace.ts',
49+
meta: {},
3750
result: {
3851
state: 'fail',
3952
error,
@@ -73,12 +86,14 @@ describe('ViewReport', () => {
7386
type: 'suite',
7487
mode: 'run',
7588
filepath: 'test/plain-stack-trace.ts',
89+
meta: {},
7690
result: {
7791
state: 'fail',
7892
errors: [{
7993
name: 'Do some test',
8094
stack: '\x1B[33mtest/plain-stack-trace.ts\x1B[0m',
8195
message: 'Error: Transform failed with 1 error:',
96+
diff,
8297
}],
8398
},
8499
tasks: [],
@@ -110,18 +125,20 @@ describe('ViewReport', () => {
110125
type: 'suite',
111126
mode: 'run',
112127
filepath: 'test/plain-stack-trace.ts',
128+
meta: {},
113129
result: {
114130
state: 'fail',
115131
errors: [{
116132
name: 'Do some test',
117133
stack: '\x1B[33mtest/plain-stack-trace.ts\x1B[0m',
118134
message: '\x1B[44mError: Transform failed with 1 error:\x1B[0m',
135+
diff,
119136
}],
120137
},
121138
tasks: [],
122139
}
123-
const container = cy.mount(<ViewReport file={file} />)
124-
.get(taskErrorSelector)
140+
const component = cy.mount(<ViewReport file={file} />)
141+
const container = component.get(taskErrorSelector)
125142
container.should('exist')
126143
container.children('pre').then((c) => {
127144
expect(c.text(), 'error has the correct plain text').equals('Do some test: Error: Transform failed with 1 error:test/plain-stack-trace.ts')
@@ -145,4 +162,15 @@ describe('ViewReport', () => {
145162
})
146163
})
147164
})
165+
166+
it('test diff display', () => {
167+
const component = cy.mount(<ViewReport file={fileWithTextStacks as File} />)
168+
169+
const diffElement = component.get('[data-testid="diff"]')
170+
diffElement.should('exist')
171+
diffElement
172+
.should('contain.text', 'Expected')
173+
.and('contain.text', 'Received')
174+
.and('not.contain.text', '\x1B')
175+
})
148176
})

packages/ui/client/components/views/ViewReportError.vue

+7-7
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ function relative(p: string) {
1414
return p
1515
}
1616
17+
const filter = computed(() => createAnsiToHtmlFilter(isDark.value))
18+
1719
const isDiffShowable = computed(() => {
18-
return props.error?.expected && props.error?.actual
20+
return !!props.error?.diff
1921
})
2022
21-
function diff() {
22-
return props.error.diff
23-
}
23+
const diff = computed(() => props.error.diff ? filter.value.toHtml(props.error.diff) : undefined)
2424
</script>
2525

2626
<template>
@@ -37,9 +37,9 @@ function diff() {
3737
@click.passive="openInEditor(stack.file, stack.line, stack.column)"
3838
/>
3939
</div>
40-
<pre v-if="isDiffShowable">
41-
{{ `\n${diff()}` }}
42-
</pre>
40+
<template v-if="isDiffShowable">
41+
<pre data-testid="diff" v-html="diff" />
42+
</template>
4343
</div>
4444
</template>
4545

0 commit comments

Comments
 (0)