Skip to content

Commit

Permalink
Add core templatetags tests and update some docstrings.
Browse files Browse the repository at this point in the history
  • Loading branch information
cdubz committed Nov 4, 2017
1 parent fe3e753 commit df5c3e9
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 6 deletions.
1 change: 0 additions & 1 deletion core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from django.db import models
from django.template.defaultfilters import slugify
from django.utils import timezone
from django.utils.timesince import timesince


def validate_duration(model, max_duration=timedelta(hours=24)):
Expand Down
5 changes: 5 additions & 0 deletions core/templatetags/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@

@register.filter()
def bool_icon(value):
"""
Create a safe HTML version of True/False using Bootstrap styles.
:param value: a boolean.
:returns: a string of html for an icon representing the boolean.
"""
if value:
classes = 'icon-true text-success'
else:
Expand Down
26 changes: 22 additions & 4 deletions core/templatetags/duration.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@

@register.filter
def duration_string(duration, precision='s'):
"""Format a duration (e.g. "2 hours, 3 minutes, 35 seconds")."""
"""
Format a duration (e.g. "2 hours, 3 minutes, 35 seconds").
:param duration: a timedetla instance.
:param precision: the level of precision to return (h for hours, m for
minutes, s for seconds)
:returns: a string representation of the duration.
"""
if not duration:
return ''
try:
Expand All @@ -22,7 +28,11 @@ def duration_string(duration, precision='s'):

@register.filter
def hours(duration):
"""Return "hours" portion of a duration."""
"""
Return the "hours" portion of a duration.
:param duration: a timedetla instance.
:returns: an integer representing the number of hours in duration.
"""
if not duration:
return 0
try:
Expand All @@ -34,7 +44,11 @@ def hours(duration):

@register.filter
def minutes(duration):
"""Return "minutes" portion of a duration."""
"""
Return the "minutes" portion of a duration.
:param duration: a timedetla instance.
:returns: an integer representing the number of minutes in duration.
"""
if not duration:
return 0
try:
Expand All @@ -46,7 +60,11 @@ def minutes(duration):

@register.filter
def seconds(duration):
"""Return "seconds" portion of a duration."""
"""
Return the "seconds" portion of a duration.
:param duration: a timedetla instance.
:returns: an integer representing the number of seconds in duration.
"""
if not duration:
return 0
try:
Expand Down
6 changes: 6 additions & 0 deletions core/templatetags/timers.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@

@register.inclusion_tag('core/timer_nav.html', takes_context=True)
def timer_nav(context, active=True):
"""
Get a list of active Timer instances to include in the nav menu.
:param context: Django's context data.
:param active: the state of Timers to filter.
:returns: a dictionary with timers data.
"""
request = context['request'] or None
timers = Timer.objects.filter(active=active)
perms = context['perms'] or None
Expand Down
1 change: 0 additions & 1 deletion core/tests/tests_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,4 +196,3 @@ def test_validators(self):
self.assertEqual(page.status_code, 200)
self.assertFormError(page, 'form', 'end',
'Date/time can not be in the future.')

48 changes: 48 additions & 0 deletions core/tests/tests_templatetags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.test import TestCase
from django.utils import timezone

from core.templatetags import bootstrap, duration


class TemplateTagsTestCase(TestCase):
def test_bootstrap_bool_icon(self):
self.assertEqual(
bootstrap.bool_icon(True),
'<i class="icon icon-true text-success" aria-hidden="true"></i>')
self.assertEqual(
bootstrap.bool_icon(False),
'<i class="icon icon-false text-danger" aria-hidden="true"></i>')

def test_duration_duration_string(self):
delta = timezone.timedelta(hours=1, minutes=30, seconds=15)
self.assertEqual(
duration.duration_string(delta),
'1 hour, 30 minutes, 15 seconds')
self.assertEqual(
duration.duration_string(delta, 'm'),
'1 hour, 30 minutes')
self.assertEqual(duration.duration_string(delta, 'h'), '1 hour')

self.assertEqual(duration.duration_string(''), '')
self.assertRaises(TypeError, duration.duration_string('not a delta'))

def test_duration_hours(self):
delta = timezone.timedelta(hours=1)
self.assertEqual(duration.hours(delta), 1)
self.assertEqual(duration.hours(''), 0)
self.assertRaises(TypeError, duration.hours('not a delta'))

def test_duration_minutes(self):
delta = timezone.timedelta(minutes=45)
self.assertEqual(duration.minutes(delta), 45)
self.assertEqual(duration.minutes(''), 0)
self.assertRaises(TypeError, duration.minutes('not a delta'))

def test_duration_seconds(self):
delta = timezone.timedelta(seconds=20)
self.assertEqual(duration.seconds(delta), 20)
self.assertEqual(duration.seconds(''), 0)
self.assertRaises(TypeError, duration.seconds('not a delta'))

0 comments on commit df5c3e9

Please sign in to comment.