tobyqin/testcube

View on GitHub
testcube/static/modules/result-detail.js

Summary

Maintainability
A
3 hrs
Test Coverage
define(['jquery', './table-support', './chart-support', './utils', 'bootstrap-dialog', 'bootstrapTable', 'bootstrapSelect'],
    function ($, support, chart, utils, BootstrapDialog) {

        "use strict";
        let f = support.formatter;

        let resultDetailColumns = [
            {title: 'ID', field: 'id'},
            {title: 'TestCase', field: 'testcase.name'},
            {title: 'Duration', field: 'duration', formatter: f.durationFormatter},
            {title: 'Passed Times', field: 'testcase_exec_info.passed'},
            {title: 'Failed Times', field: 'testcase_exec_info.failed'},
            {title: 'Total Execution', field: 'testcase_exec_info.total'},
            {title: 'Assigned To', field: 'assigned_to'},
            {title: 'Client', field: 'test_client.name'},
            {title: 'Outcome', field: 'get_outcome_display', formatter: f.outcomeFormatter}
        ];

        let resultHistoryColumns = [
            {title: 'ID', field: 'id', formatter: f.resultIdFormatter},
            {title: 'Run On', field: 'run_info.start_time', formatter: f.timeFormatter},
            {title: 'Duration', field: 'duration', formatter: f.durationFormatter},
            {title: 'Error Message', field: 'error_message'},
            {title: 'Reason', field: 'reason'},
            {title: 'Issue', field: 'issue_id'},
            {title: 'Client', field: 'test_client.name'},
            {title: 'Outcome', field: 'get_outcome_display', formatter: f.outcomeFormatter}
        ];

        let resultFilesColumns = [
            {title: 'Time', field: 'time', formatter: f.timeFormatter},
            {title: 'Name', field: 'url', formatter: f.imageUrlFormatter},
            {title: 'Size', field: 'size'}
        ];

        let resultResetsColumns = [
            {title: 'By', field: 'reset_by'},
            {title: 'Reason', field: 'reset_reason'},
            {title: 'Reset Time', field: 'reset_on', formatter: f.timeFormatter},
            {title: 'Run Time', field: 'run_on', formatter: f.timeFormatter},
            {title: 'Duration', field: 'duration', formatter: f.durationFormatter},
            {title: 'Status', field: 'get_reset_status_display'},
            {title: 'Outcome', field: 'get_outcome_display'},
            {title: 'Detail', field: 'error', formatter: f.resetDetailFormatter}
        ];


        function summaryDataHandler(data) {
            window.app.summaryInfo = data;
            return [data];
        }

        function resultDetailSummaryPostEvent(data) {
            if (data[0] === undefined) return;
            let result = data[0];
            let stderr = "Nothing found.";
            let stdout = "Nothing found.";

            if (result.error) {
                stderr = result.error.message + '\n\n' + result.error.stacktrace;
            }
            if (result.stdout) {
                stdout = result.stdout;
            }

            $('#stderr').empty().append(utils.safeLog(stderr.trim()));
            $('#stdout').empty().append(utils.safeLog(stdout.trim()));
            utils.startLogHighlight();

            if (result.test_run) {
                let nav = `<a href="/runs/${result.test_run.id}">${result.test_run.id} - ${result.test_run.name}</a>`;
                $('#run-nav').empty().append(nav);
            }

            $('#result-files').bootstrapTable({
                url: `/api/results/${result.id}/files/`,
                responseHandler: resultFileTableDataHandler,
                search: false,
                pagination: false,
                sortable: false,
                showFooter: false,
                columns: resultFilesColumns
            });

            $('#result-resets').bootstrapTable({
                url: `/api/results/${result.id}/resets/`,
                responseHandler: resultResetsTableDataHandler,
                search: false,
                pagination: false,
                sortable: false,
                showFooter: false,
                columns: resultResetsColumns,
                onPostBody: setupResetResultDetailViewEvent
            });

            if (result.testcase) {
                let nav = `${result.id} - ${result.testcase.name}`;
                $('#result-nav').empty().append(nav);

                $('#result-history').bootstrapTable({
                    url: `/api/cases/${result.testcase.id}/history/`,
                    responseHandler: resultHistoryTableDataHandler,
                    search: false,
                    pagination: false,
                    sortable: false,
                    showFooter: false,
                    columns: resultHistoryColumns,
                    onPostBody: function () {
                        chart.renderResultDetailChart();
                    }
                });
            }
        }

        function setupResetResultDetailViewEvent() {
            $('.reset-result').click(function () {
                waitForLoading();
                let output = $(this).attr('data-text');
                output = output.replace('||', '\n\n').replace('||', '\n---------- OUTPUT --------\n');
                let detail = `<pre><code data-language="log">${output}</code></pre>`;
                BootstrapDialog.show({
                    title: 'Reset Detail',
                    message: detail,
                    size: BootstrapDialog.SIZE_WIDE
                });

                utils.startLogHighlight();
                loadingCompleted();
            });
        }

        function resultHistoryTableDataHandler(data) {
            window.app.resultHistory = data;
            for (let r of data.results) {
                r.error_message = utils.safeMessage(r.error_message);
            }
            return data.results;
        }

        function resultFileTableDataHandler(data) {
            window.app.resultFiles = data.files;

            // hide the file tab if no files found
            if (data.files.length === 0) {
                $("a[href='#tab-files']").hide();
            }
            return data.files;
        }

        function resultResetsTableDataHandler(data) {
            for (let result of data.reset_results) {
                if (!result.error) {
                    result.error = result.stdout;
                } else {
                    result.error.stdout = result.stdout;
                }
            }
            window.app.resultResets = data.reset_results;
            return data.reset_results;
        }

        function renderResultDetailPage(resultId) {
            $('#table').bootstrapTable({
                url: `/api/results/${ resultId }/info/`,
                responseHandler: summaryDataHandler,
                search: false,
                pagination: false,
                sortName: 'id',
                sortOrder: 'desc',
                sortable: false,
                showFooter: false,
                columns: resultDetailColumns,
                onPostBody: resultDetailSummaryPostEvent
            });
        }

        function postFormAsync(formSelector) {
            $(formSelector).submit(function (event) {
                $.ajax({
                    url: $(formSelector).attr('action'),
                    type: 'post',
                    dataType: 'application/json',
                    data: $(formSelector).serialize(),
                    async: true,
                    complete: function (xhr) {

                        let messageCls = 'text-danger';
                        if (xhr.status === 200) {
                            messageCls = 'text-success';
                        }
                        $(formSelector + '-message').empty()
                            .append(xhr.responseText)
                            .removeClass().addClass(messageCls);
                    }
                });
                event.preventDefault();
                return false;
            });
        }

        return {
            renderResultDetailPage: renderResultDetailPage,
            postFormAsync: postFormAsync
        };

    });