TestResult.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <AppSection :label="`${t('test.results')}`">
  3. <div
  4. v-if="
  5. testResults &&
  6. (testResults.expectResults.length || testResults.tests.length)
  7. "
  8. >
  9. <div
  10. class="
  11. bg-primary
  12. border-dividerLight
  13. top-lowerSecondaryStickyFold
  14. sticky
  15. z-10
  16. flex
  17. items-center
  18. justify-between
  19. flex-1
  20. pl-4
  21. border-b
  22. "
  23. >
  24. <label class="font-semibold text-secondaryLight">
  25. {{ t("test.report") }}
  26. </label>
  27. <ButtonSecondary
  28. v-tippy="{ theme: 'tooltip' }"
  29. :title="t('action.clear')"
  30. svg="trash-2"
  31. @click.native="clearContent()"
  32. />
  33. </div>
  34. <div class="border-b divide-dividerLight border-dividerLight divide-y-4">
  35. <div v-if="testResults.tests" class="divide-dividerLight divide-y-4">
  36. <HttpTestResultEntry
  37. v-for="(result, index) in testResults.tests"
  38. :key="`result-${index}`"
  39. :test-results="result"
  40. />
  41. </div>
  42. <div
  43. v-if="testResults.expectResults"
  44. class="divide-dividerLight divide-y"
  45. >
  46. <HttpTestResultReport
  47. v-if="testResults.expectResults.length"
  48. :test-results="testResults"
  49. />
  50. <div
  51. v-for="(result, index) in testResults.expectResults"
  52. :key="`result-${index}`"
  53. class="flex items-center px-4 py-2"
  54. >
  55. <i
  56. class="mr-4 material-icons"
  57. :class="
  58. result.status === 'pass' ? 'text-green-500' : 'text-red-500'
  59. "
  60. >
  61. {{ result.status === "pass" ? "check" : "close" }}
  62. </i>
  63. <span v-if="result.message" class="text-secondaryDark">
  64. {{ result.message }}
  65. </span>
  66. <span class="text-secondaryLight">
  67. {{
  68. ` \xA0 — \xA0 ${
  69. result.status === "pass" ? t("test.passed") : t("test.failed")
  70. }`
  71. }}
  72. </span>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <div
  78. v-else
  79. class="flex flex-col items-center justify-center p-4 text-secondaryLight"
  80. >
  81. <img
  82. :src="`/images/states/${$colorMode.value}/validation.svg`"
  83. loading="lazy"
  84. class="inline-flex flex-col object-contain object-center w-16 h-16 my-4"
  85. :alt="`${t('empty.tests')}`"
  86. />
  87. <span class="pb-2 text-center">
  88. {{ t("empty.tests") }}
  89. </span>
  90. <span class="pb-4 text-center">
  91. {{ t("helpers.tests") }}
  92. </span>
  93. <ButtonSecondary
  94. outline
  95. :label="`${t('action.learn_more')}`"
  96. to="https://docs.hoppscotch.io/features/tests"
  97. blank
  98. svg="external-link"
  99. reverse
  100. class="my-4"
  101. />
  102. </div>
  103. </AppSection>
  104. </template>
  105. <script setup lang="ts">
  106. import { useReadonlyStream, useI18n } from "~/helpers/utils/composables"
  107. import { restTestResults$, setRESTTestResults } from "~/newstore/RESTSession"
  108. const t = useI18n()
  109. const testResults = useReadonlyStream(restTestResults$, null)
  110. const clearContent = () => setRESTTestResults(null)
  111. </script>