mirror of
https://github.com/hanzoai/vitest.git
synced 2026-09-24 17:04:25 +00:00
105 lines
2.5 KiB
Vue
105 lines
2.5 KiB
Vue
<script setup lang="ts">
|
|
import type { RunnerTask, RunnerTestFile, RunnerTestSuite } from 'vitest'
|
|
import { computed } from 'vue'
|
|
import { config } from '~/composables/client'
|
|
import FailureScreenshot from '../FailureScreenshot.vue'
|
|
import ViewReportError from './ViewReportError.vue'
|
|
|
|
const props = defineProps<{
|
|
file: RunnerTestFile
|
|
}>()
|
|
|
|
type LeveledTask = RunnerTask & {
|
|
level: number
|
|
}
|
|
|
|
function collectFailed(task: RunnerTask, level: number): LeveledTask[] {
|
|
if (task.result?.state !== 'fail') {
|
|
return []
|
|
}
|
|
|
|
if (task.type === 'test') {
|
|
return [{ ...task, level }]
|
|
}
|
|
else {
|
|
return [
|
|
{ ...task, level },
|
|
...task.tasks.flatMap(t => collectFailed(t, level + 1)),
|
|
]
|
|
}
|
|
}
|
|
|
|
const failed = computed(() => {
|
|
const file = props.file
|
|
const failedFlatMap = file.tasks?.flatMap(t => collectFailed(t, 0)) ?? []
|
|
const result = file.result
|
|
const fileError = result?.errors?.[0]
|
|
// we must check also if the test cannot compile
|
|
if (fileError) {
|
|
// create a dummy one
|
|
const fileErrorTask: RunnerTestSuite & { level: number } = {
|
|
id: file!.id,
|
|
file: file!,
|
|
name: file!.name,
|
|
fullName: file!.name,
|
|
level: 0,
|
|
type: 'suite',
|
|
mode: 'run',
|
|
meta: {},
|
|
tasks: [],
|
|
result,
|
|
}
|
|
failedFlatMap.unshift(fileErrorTask)
|
|
}
|
|
return failedFlatMap
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div h-full class="scrolls">
|
|
<template v-if="failed.length">
|
|
<div v-for="task of failed" :id="task.id" :key="task.id">
|
|
<div
|
|
bg="red-500/10"
|
|
text="red-500 sm"
|
|
p="x3 y2"
|
|
m-2
|
|
rounded
|
|
:style="{
|
|
'margin-left': `${2 * (task as LeveledTask).level + 0.5}rem`,
|
|
}"
|
|
>
|
|
<div flex="~ gap-2 items-center">
|
|
<span>{{ task.name }}</span>
|
|
<FailureScreenshot :task="task" />
|
|
</div>
|
|
<template v-if="task.result?.errors && config.root">
|
|
<ViewReportError
|
|
v-for="(error, idx) of task.result.errors"
|
|
:key="idx"
|
|
:error="error"
|
|
:filename="file.name"
|
|
:root="config.root"
|
|
:file-id="file.id"
|
|
/>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<template v-else>
|
|
<div bg="green-500/10" text="green-500 sm" p="x4 y2" m-2 rounded>
|
|
All tests passed in this file
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.task-error {
|
|
--cm-ttc-c-thumb: #ccc;
|
|
}
|
|
html.dark .task-error {
|
|
--cm-ttc-c-thumb: #444;
|
|
}
|
|
</style>
|