tobyqin/testcube

View on GitHub
testcube/core/models/test_result.py

Summary

Maintainability
A
0 mins
Test Coverage
from datetime import timedelta

from django.core.exceptions import ObjectDoesNotExist
from django.db import models

from .result_analysis import ResultAnalysis
from .result_error import ResultError
from .test_case import TestCase
from .test_client import TestClient
from .test_run import TestRun

OUTCOME_CHOICES = ((0, 'Passed'), (1, 'Failed'),
                   (2, 'Skipped'), (3, 'Error'),
                   (4, 'Manual Passed'), (5, 'Pending'))


class TestResult(models.Model):
    outcome = models.IntegerField(choices=OUTCOME_CHOICES)
    stdout = models.TextField(default=None, null=True, blank=True)
    duration = models.DurationField(default=timedelta())
    assigned_to = models.CharField(max_length=50)
    created_on = models.DateTimeField(auto_now_add=True)

    test_run = models.ForeignKey(TestRun, on_delete=models.CASCADE, related_name='results')
    testcase = models.ForeignKey(TestCase, on_delete=models.CASCADE, related_name='results')
    test_client = models.ForeignKey(TestClient, on_delete=models.PROTECT, related_name='results')

    analysis = models.OneToOneField(ResultAnalysis, on_delete=models.SET_NULL,
                                    null=True, blank=True, related_name='result')

    error = models.OneToOneField(ResultError, on_delete=models.SET_NULL,
                                 null=True, blank=True, related_name='result')

    def run_info(self):
        return {'id': self.test_run.id,
                'name': self.test_run.name,
                'start_time': self.test_run.start_time}

    def testcase_info(self):
        return {'id': self.testcase.id,
                'name': self.testcase.name}

    def testcase_name(self):
        return self.testcase.name

    def testcase_exec_info(self):
        return self.testcase.execution_info()

    def stability(self):
        return self.testcase.stability()

    def error_message(self):
        if self.error:
            return self.error.message

    def reason(self):
        if self.analysis:
            return self.analysis.get_reason_display()

    def issue_id(self):
        if self.analysis:
            if self.analysis.issue:
                return self.analysis.issue.name

    def files(self):
        from .result_file import ResultFile
        files = ResultFile.objects.filter(run=self.test_run, name__contains=self.testcase.name)
        return [{
            'name': f.name,
            'url': f.file.url,
            'time': f.file_created_time,
            'size': f.file_size()
        } for f in files if f.file]

    def is_reset_in_progress(self):
        """check reset in progress or not."""
        in_progress = self.reset_results.filter(reset_status=1).all()
        return len(in_progress) > 0

    def get_reset_profile(self):
        try:
            return self.testcase.product.runner_profile
        except ObjectDoesNotExist:
            return None

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return '{}'.format(self.id)