summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
blob: 89ee7126cb82c8c0974db5fb172c32f84a302644 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<script>
  import { mapActions, mapGetters } from 'vuex';
  import { s__ } from '~/locale';
  import ReportSection from '~/vue_shared/components/reports/report_section.vue';
  import SummaryRow from '~/vue_shared/components/reports/summary_row.vue';
  import IssuesList from '~/vue_shared/components/reports/issues_list.vue';
  import Modal from './modal.vue';
  import createStore from '../store';
  import { textBuilder, statusIcon } from '../store/utils';

  export default {
    name: 'GroupedTestReportsApp',
    store: createStore(),
    components: {
      ReportSection,
      SummaryRow,
      IssuesList,
      Modal,
    },
    props: {
      endpoint: {
        type: String,
        required: true,
      },
    },
    computed: {
      ...mapGetters([
        'reports',
        'summaryStatus',
        'isLoading',
        'hasError',
        'summaryCounts',
        'modalTitle',
        'modalData',
        'isCreatingNewIssue',
      ]),

      groupedSummaryText() {
        if (this.isLoading) {
          return s__('Reports|Test summary results are being parsed');
        }

        if (this.hasError || !this.summaryCounts) {
          return s__('Reports|Test summary failed loading results');
        }

        const { failed, total, resolved } = this.summaryCounts;

        return textBuilder(s__('Reports|Test summary'), failed, resolved, total);
      },
    },
    created() {
      this.setEndpoint(this.endpoint);

      this.fetchReports();
    },
    methods: {
      ...mapActions(['setEndpoint', 'fetchReports']),
      reportText(report) {
         // TODO_SAM: Check with backend if summary is always present.
         // if it is we may be able to remove this check.
        const summary = report.summary || {};
        return textBuilder(report.name, summary.failed, summary.resolved, summary.total);
      },
      getReportIcon(report) {
        return statusIcon(report.status);
      },
      createIssue() {
        // TODO_SAM
      },
    },
  };
</script>
<template>
  <report-section
    :status="summaryStatus"
    :success-text="groupedSummaryText"
    :loading-text="groupedSummaryText"
    :error-text="groupedSummaryText"
    :has-issues="reports.length > 0"
    class="mr-widget-border-top grouped-security-reports"
  >
    <div
      slot="body"
      class="mr-widget-grouped-section report-block"
    >
      <template
        v-for="(report, i) in reports"
      >
        <summary-row
          :summary="reportText(report)"
          :status-icon="getReportIcon(report)"
          :key="`summary-row-${i}`"

        />
        <issues-list
          :unresolved-issues="report.new_failures"
          :resolved-issues="report.resolved_failures"
          :all-issues="report.existing_failures"
          :key="`issues-list-${i}`"
          type="test"
          class="report-block-group-list"
        />
      </template>

      <modal
        :title="modalTitle"
        :modal-data="modalData"
        :is-creating-new-issue="isCreatingNewIssue"
        @createIssue="createIssue"
      />
    </div>
  </report-section>
</template>