utils.py 3.13 KB
Newer Older
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
"""
Utilities for instructor unit tests
"""
import datetime
import json
import random
from django.utils.timezone import utc
from util.date_utils import get_default_time_display


class FakeInfo(object):
    """Parent class for faking objects used in tests"""
    FEATURES = []

    def __init__(self):
        for feature in self.FEATURES:
            setattr(self, feature, u'expected')

    def to_dict(self):
        """ Returns a dict representation of the object """
        return {key: getattr(self, key) for key in self.FEATURES}


class FakeContentTask(FakeInfo):
    """ Fake task info needed for email content list """
    FEATURES = [
        'task_input',
        'task_output',
29
        'requester',
30 31
    ]

32
    def __init__(self, email_id, num_sent, num_failed, sent_to):
33
        super(FakeContentTask, self).__init__()
34
        self.task_input = {'email_id': email_id}
35
        self.task_input = json.dumps(self.task_input)
36
        self.task_output = {'succeeded': num_sent, 'failed': num_failed}
37
        self.task_output = json.dumps(self.task_output)
38
        self.requester = 'expected'
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

    def make_invalid_input(self):
        """Corrupt the task input field to test errors"""
        self.task_input = "THIS IS INVALID JSON"


class FakeEmail(FakeInfo):
    """ Corresponding fake email for a fake task """
    FEATURES = [
        'subject',
        'html_message',
        'id',
        'created',
    ]

    def __init__(self, email_id):
        super(FakeEmail, self).__init__()
56
        self.id = unicode(email_id)  # pylint: disable=invalid-name
57
        # Select a random data for create field
58 59 60 61 62
        year = random.randint(1950, 2000)
        month = random.randint(1, 12)
        day = random.randint(1, 28)
        hour = random.randint(0, 23)
        minute = random.randint(0, 59)
63
        self.created = datetime.datetime(year, month, day, hour, minute, tzinfo=utc)
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
        self.targets = FakeTargetGroup()


class FakeTarget(object):
    """ Corresponding fake target for a fake email """
    target_type = "expected"

    def long_display(self):
        """ Mocks out a class method """
        return self.target_type


class FakeTargetGroup(object):
    """ Mocks out the M2M relationship between FakeEmail and FakeTarget """
    def all(self):
        """ Mocks out a django method """
        return [FakeTarget()]
81 82 83 84 85 86 87 88


class FakeEmailInfo(FakeInfo):
    """ Fake email information object """
    FEATURES = [
        u'created',
        u'sent_to',
        u'email',
89 90
        u'number_sent',
        u'requester',
91 92 93 94 95 96 97 98
    ]

    EMAIL_FEATURES = [
        u'subject',
        u'html_message',
        u'id'
    ]

99
    def __init__(self, fake_email, num_sent, num_failed):
100 101
        super(FakeEmailInfo, self).__init__()
        self.created = get_default_time_display(fake_email.created)
102 103 104 105 106 107

        number_sent = str(num_sent) + ' sent'
        if num_failed > 0:
            number_sent += ', ' + str(num_failed) + " failed"

        self.number_sent = number_sent
108 109
        fake_email_dict = fake_email.to_dict()
        self.email = {feature: fake_email_dict[feature] for feature in self.EMAIL_FEATURES}
110
        self.requester = u'expected'
111
        self.sent_to = [u'expected']