Skip to content

Commit

Permalink
Initial touches on Test executions table
Browse files Browse the repository at this point in the history
in test run page
  • Loading branch information
asankov authored and atodorov committed May 17, 2020
1 parent 0a1b435 commit 61ede13
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 30 deletions.
109 changes: 80 additions & 29 deletions tcms/testruns/static/testruns/js/get.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
let executionStatuses;

$(document).ready(() => {

$('.bootstrap-switch').bootstrapSwitch();
Expand Down Expand Up @@ -27,38 +25,36 @@ $(document).ready(() => {
// bind everything in tags table
tagsCard('TestRun', testRunId, { run: testRunId }, permRemoveTag);

jsonRPC('TestExecutionStatus.filter', {}, data => {
executionStatuses = data
drawPercentBar(testRunId)
jsonRPC('TestExecutionStatus.filter', {}, executionStatuses => {
jsonRPC('TestExecution.filter', { 'run_id': testRunId }, testExecutions => {
drawPercentBar(testExecutions, executionStatuses)
renderTestExecutions(testExecutions, executionStatuses)
})
})
})


function drawPercentBar(testRunId) {

jsonRPC('TestExecution.filter', { 'run_id': testRunId }, testExecutions => {

let positiveCount = 0;
let negativeCount = 0;
let allCount = testExecutions.length;
let statusCount = {}
executionStatuses.forEach(s => statusCount[s.name] = { count: 0, id: s.id })
function drawPercentBar(testExecutions, executionStatuses) {
let positiveCount = 0;
let negativeCount = 0;
let allCount = testExecutions.length;
let statusCount = {}
executionStatuses.forEach(s => statusCount[s.name] = { count: 0, id: s.id })

testExecutions.forEach(testExecution => {
const executionStatus = executionStatuses.find(s => s.id === testExecution.status_id)

if (executionStatus.weight > 0) {
positiveCount++
} else if (executionStatus.weight < 0) {
negativeCount++
}
testExecutions.forEach(testExecution => {
const executionStatus = executionStatuses.find(s => s.id === testExecution.status_id)

statusCount[executionStatus.name].count++
})
if (executionStatus.weight > 0) {
positiveCount++
} else if (executionStatus.weight < 0) {
negativeCount++
}

renderProgressBars(positiveCount, negativeCount, allCount)
renderCountPerStatusList(statusCount)
statusCount[executionStatus.name].count++
})

renderProgressBars(positiveCount, negativeCount, allCount)
renderCountPerStatusList(statusCount)
}

function renderProgressBars(positiveCount, negativeCount, allCount) {
Expand Down Expand Up @@ -92,13 +88,68 @@ function renderProgressBars(positiveCount, negativeCount, allCount) {

function renderCountPerStatusList(statusCount) {
for (var status in statusCount) {
const status_id = statusCount[status].id;
const statusId = statusCount[status].id;

$(`#count-for-status-${status_id}`).attr('href', `?status_id=${status_id}`);
$(`#count-for-status-${status_id}`).text(statusCount[status].count);
$(`#count-for-status-${statusId}`).attr('href', `?status_id=${statusId}`).text(statusCount[status].count);
}
}

function renderTestExecutions(testExecutions, executionStatuses) {
const container = $('#test-executions-container')
const testExecutionRowTemplate = $('#test-execution-row')[0].content

const testCaseIds = []
testExecutions.forEach(testExecution => {
testCaseIds.push(testExecution.case_id)

const executionStatus = executionStatuses.find(status => status.id === testExecution.status_id)
const template = $(testExecutionRowTemplate.cloneNode(true))

container.append(renderTestExecutionRow(template, testExecution, executionStatus))
})

treeViewBind();
renderAdditionalInformation(testExecutions, testCaseIds)
}

function renderAdditionalInformation(testExecutions, testExecutionCaseIds) {
jsonRPC('TestCase.filter', { 'id__in': testExecutionCaseIds }, testCases => {
testExecutions.forEach(testExecution => {
const testCase = testCases.find(testCase => testCase.id === testExecution.case_id)

const listGroupItem = $(`.test-execution-${testExecution.id}`)
listGroupItem.find('.test-execution-priority').html(testCase.priority)
listGroupItem.find('.test-execution-category').html(testCase.category)

const isAutomatedElement = listGroupItem.find('.test-execution-automated')
const isAutomatedIcon = testCase.is_automated ? 'fa-cog' : 'fa-thumbs-up'
const isAutomatedAttr = testCase.is_automated ? isAutomatedElement.data('automated') : isAutomatedElement.data('manual')
isAutomatedElement.addClass(isAutomatedIcon)
isAutomatedElement.attr('title', isAutomatedAttr)

jsonRPC('TestExecution.get_links', { 'execution_id': testExecution.id, 'is_defect': true }, bugs => {
listGroupItem.find('.test-execution-bugs-count').html(bugs.length)
})
})
})

}

function renderTestExecutionRow(template, testExecution, testExecutionStatus) {
template.find('.list-group-item').addClass(`test-execution-${testExecution.id}`)
template.find('.test-execution-info').html(`TE-${testExecution.id}`)
template.find('.test-execution-info-link').html(testExecution.case)
template.find('.test-execution-info-link').attr('href', `/case/${testExecution.case_id}/`)
template.find('.test-execution-tester').html(testExecution.tested_by || '-')
template.find('.test-execution-asignee').html(testExecution.assignee || '-')

template.find('.test-execution-status-icon').addClass(testExecutionStatus.icon).css('color', testExecutionStatus.color)
template.find('.test-execution-status-name').html(testExecutionStatus.name).css('color', testExecutionStatus.color)

return template
}


/////// the functions below were used in bulk-menu actions
/////// and need updates before they can be used again
///////
Expand Down
71 changes: 70 additions & 1 deletion tcms/testruns/templates/testruns/get.html
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,83 @@ <h2 class="card-pf-title" style="text-align: left">
</div>
</div> <!-- /row -->

<div class="row row-cards-pf">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="card-pf card-pf-accented">
<h2 class="card-pf-title">
{% trans 'Test executions' %}
</h2>
<div class="card-pf-body">
<div id="test-executions-container" class="list-group tree-list-view-pf">
<template id="test-execution-row">
<div class="list-group-item">
<div class="list-group-item-header">
<div class="list-view-pf-main-info">
<div class="list-view-pf-left">
<span class="fa fa-angle-right"></span>
</div>
<div class="list-view-pf-body">
<div class="list-view-pf-description" style="flex: 1 0 30%;">
<div class="list-group-item-text">
<span class="test-execution-info"></span>
<a class="test-execution-info-link"></a>
</div>
</div>
<div class="list-view-pf-additional-info">
<div class="list-view-pf-additional-info">
<div class="list-view-pf-additional-info-item">
<span class="fa test-execution-automated" data-automated="{% trans 'Automated' %}" data-manual="{% trans 'Manual' %}"></span>
</div>
<div title="{% trans 'Priority' %}" class="list-view-pf-additional-info-item">
<span class="fa fa-hourglass"></span>
<span class="test-execution-priority"></span>
</div>
<div title="{% trans 'Category' %}" class="list-view-pf-additional-info-item">
<span class="fa fa-tag"></span>
<span class="test-execution-category"></span>
</div>
<div title="{% trans 'Author' %}" class="list-view-pf-additional-info-item">
<span class="fa pficon-user"></span>
<span class="test-execution-asignee"></span>
</div>
<div title="{% trans 'Default tester' %}" class="list-view-pf-additional-info-item">
<span class="fa fa-search"></span>
<span class="test-execution-tester"></span>
</div>
<div title="{% trans 'Bugs' %}" class="list-view-pf-additional-info-item">
<span class="fa fa-bug"></span>
{% comment %} TODO fetch bugs {% endcomment %}
<span class="test-execution-bugs-count"></span>
</div>
</div>
<div class="list-view-pf-additional-info" style="width: 30%;">
<div title="{% trans 'Status' %}" class="list-view-pf-additional-info-item">
<i class="fa test-execution-status-icon"></i>
<strong class="test-execution-status-name"></strong>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="list-group-item-container container-fluid hidden">
{% comment %} TODO: exandable content goes here {% endcomment %}
</div>
</div>
</template>
</div>
</div>
</div>
</div>
</div> <!-- /row -->

<div class="row row-cards-pf">
<div class="col-xs-12 col-sm-6 col-md-6">
{% include 'include/attachments.html' %}
</div>
</div> <!-- /row -->
</div>


<script src="{% static 'typeahead.js/dist/typeahead.jquery.min.js' %}"></script>
<script src="{% static 'bootstrap-switch/dist/js/bootstrap-switch.min.js' %}"></script>
<script src="{% static 'moment/min/moment.min.js' %}"></script>
Expand Down

0 comments on commit 61ede13

Please sign in to comment.