Skip to content

Commit

Permalink
starting implementation of url generation
Browse files Browse the repository at this point in the history
  • Loading branch information
KarstenSchulz committed Sep 15, 2015
1 parent 4715d8a commit 4ae220c
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 24 deletions.
76 changes: 74 additions & 2 deletions tests/test_cli.py
Expand Up @@ -4,6 +4,7 @@

import unittest
import sys
import subprocess
from twodolib import TwoDoTask
from twodolib import cli

Expand Down Expand Up @@ -45,13 +46,13 @@ def test_set_list_name(self):
"""A task can belong to a list: -l listname."""
args = "TestTask -l business".split()
parsed = cli.parse_arguments(args)
self.assertEqual(parsed.list, 'business')
self.assertEqual(parsed.for_list, 'business')

def test_set_list_name_long_option(self):
"""A task can belong to a list: --list listname."""
args = "TestTask --list business".split()
parsed = cli.parse_arguments(args)
self.assertEqual(parsed.list, 'business')
self.assertEqual(parsed.for_list, 'business')

def test_set_note_of_task(self):
"""A task can have a note: -n "some notes to the task ..."."""
Expand Down Expand Up @@ -181,3 +182,74 @@ def test_missing_args_raise_system_exit(self):
sys.argv = []
with self.assertRaises(SystemExit):
cli.main()


class TestCliGeneratesCorrectTwoDoTaskObject(unittest.TestCase):

"""Command line args should create correct task object."""

def test_create_simple_task(self):
"""Create a task with a title."""
parsed = cli.parse_arguments(['TestTask'])
task = TwoDoTask(**vars(parsed))
self.assertEqual(task.task, 'TestTask')

def test_create_simple_task_has_correct_defaults(self):
"""Create a task with correct defaults."""
parsed = cli.parse_arguments(['TestTask'])
task = TwoDoTask(**vars(parsed))
self.assertEqual(task.task, 'TestTask')
self.assertEqual(task.type, TwoDoTask.TASK_TYPE)
self.assertIsNone(task.for_list)
self.assertIsNone(task.forParentTask)
self.assertIsNone(task.note)
self.assertEqual(task.priority, '0')
self.assertEqual(task.starred, '0')
self.assertIsNone(task.tags)
self.assertIsNone(task.due)
self.assertIsNone(task.dueTime)
self.assertIsNone(task.start)
self.assertIsNone(task.repeat)
self.assertIsNone(task.action)
self.assertEqual(task.ignoreDefaults, '0')

def test_task_has_repeat_and_priority(self):
"""Create a task with weekly repetition and high priority."""
args = "TestTask --repeat 1 --priority 2".split()
parsed = cli.parse_arguments(args)
task = TwoDoTask(**vars(parsed))
self.assertEqual(task.task, 'TestTask')
self.assertEqual(task.type, TwoDoTask.TASK_TYPE)
self.assertIsNone(task.for_list)
self.assertIsNone(task.forParentTask)
self.assertIsNone(task.note)
self.assertEqual(task.priority, '2')
self.assertEqual(task.starred, '0')
self.assertIsNone(task.tags)
self.assertIsNone(task.due)
self.assertIsNone(task.dueTime)
self.assertIsNone(task.start)
self.assertEqual(task.repeat, '1')
self.assertIsNone(task.action)
self.assertEqual(task.ignoreDefaults, '0')

def test_task_is_starred(self):
"""Create a starred task."""
args = "TestTask -s".split()
parsed = cli.parse_arguments(args)
task = TwoDoTask(**vars(parsed))
self.assertEqual(task.task, 'TestTask')
self.assertEqual(task.starred, '1')

def test_set_task_to_ignore_defaults(self):
"""Create a task, which ignores date and time defaults."""
args = "TestTask -i".split()
parsed = cli.parse_arguments(args)
task = TwoDoTask(**vars(parsed))
self.assertEqual(task.task, 'TestTask')
self.assertEqual(task.ignoreDefaults, '1')

def test_call_of_cli_generates_no_output(self):
"""Call command generates no output."""
msg = subprocess.check_output(['python', '-m', 'twodolib.cli', 'test'])
self.assertEqual(len(msg), 0)
40 changes: 37 additions & 3 deletions tests/test_twodolib.py
Expand Up @@ -3,7 +3,9 @@
"""Tests for `twodolib` module."""
import unittest
import sys

import twodolib
from twodolib import TwoDoTask

PY3 = sys.version_info > (3,)
if PY3:
Expand Down Expand Up @@ -59,6 +61,11 @@ def test_simple_task_with_title_only(self):
task = twodolib.TwoDoTask(title)
self.assertEqual(task.task, title)

def test_task_with_title_length_of_zero_raises_valueerror(self):
"""Create a simple task only by title."""
title = ''
self.assertRaises(ValueError, twodolib.TwoDoTask, title)

def test_default_values_of_simple_task(self):
"""Create a task by title and check the presence of attributes."""
task = twodolib.TwoDoTask('Save the world.')
Expand All @@ -67,12 +74,39 @@ def test_default_values_of_simple_task(self):
self.assertIsNone(task.for_list)
self.assertIsNone(task.forParentTask)
self.assertIsNone(task.note)
self.assertEqual(task.priority, 0)
self.assertEqual(task.starred, 0)
self.assertEqual(task.priority, '0')
self.assertEqual(task.starred, '0')
self.assertIsNone(task.tags)
self.assertIsNone(task.due)
self.assertIsNone(task.dueTime)
self.assertIsNone(task.start)
self.assertIsNone(task.repeat)
self.assertIsNone(task.action)
self.assertEqual(task.ignoreDefaults, 0)
self.assertEqual(task.ignoreDefaults, '0')

def test_simple_task_url_is_correct(self):
"""The URL for a simple task is correct."""
task_title = 'Test title of the task.'
quoted_title = quote(task_title)
expected_url = 'twodo://x-callback-url/add?task=' + quoted_title
task = TwoDoTask(task_title)
self.assertEqual(task.url(), expected_url)

def test_project_task_url_is_correct(self):
"""The URL for a project task is correct."""
task_title = 'Test title of the task.'
quoted_title = quote(task_title)
expected_url = 'twodo://x-callback-url/add?task=' + quoted_title
expected_url += '&type=1'
task = TwoDoTask(task_title, type='1')
self.assertEqual(task.url(), expected_url)

def test_task_for_a_list_url_is_correct(self):
"""The URL for a task for a list is correct."""
task_title = 'Test title of the task.'
quoted_title = quote(task_title)
expected_url = 'twodo://x-callback-url/add?task=' + quoted_title
quoted_list = quote('urgent errands')
expected_url += '&for_list={}'.format(quoted_list)
task = TwoDoTask(task_title, for_list='urgent errands')
self.assertEqual(task.url(), expected_url)
4 changes: 2 additions & 2 deletions twodolib/cli.py
Expand Up @@ -41,7 +41,7 @@ def parse_arguments(args):
help='Type of task to create. Following options are '
'supported: 0 - Task (default), 1 - Project, '
'2 - Checklist', default='0')
p.add_argument('-l', '--list', metavar='FOR_LIST',
p.add_argument('-l', '--list', metavar='FOR_LIST', dest='for_list',
help='Name of an existing list in app, case-insensitive. '
'Default list or the currently visible list on screen '
'is selected if not used.',
Expand Down Expand Up @@ -87,5 +87,5 @@ def main():
parse_arguments(sys.argv[1:])


if __name__ == '__main__':
if __name__ == '__main__': # pragma: no cover
main()
47 changes: 30 additions & 17 deletions twodolib/urlhelper.py
Expand Up @@ -9,7 +9,8 @@

PY3 = sys.version_info > (3,)
if PY3:
from urllib.parse import quote
# noinspection PyUnresolvedReferences
from urllib.parse import quote # pragma: no cover
else:
from urllib import quote

Expand All @@ -20,41 +21,53 @@
showscheduled_url = 'twodo://x-callback-url/showScheduled'


_base_url = 'twodo://x-callback-url/add?{}'


def get_add_url(task_title):
"""Return a url to add the task, represented by the arguments."""
return _base_url.format('task=' + quote(task_title))
return TwoDoTask.BASE_URL.format('task=' + quote(task_title))


class TwoDoTask(object):

"""Represents all attributes of a task in the 2DoApp."""

BASE_URL = 'twodo://x-callback-url/add?{}'
TASK_TYPE = '0'
PROJECT_TYPE = '1'
CHECKLIST_TYPE = '2'

def __init__(self, task_title, type=TASK_TYPE, for_list=None,
for_parent_task=None, note=None, priority=0, starred=0,
tags=None, due=None, due_time=None, start=None, repeat=None,
action=None, ignore_defaults=0):
"""Create a 2Do task.
:type task_title: basestring
"""
self.task = task_title
def __init__(self, task, type=TASK_TYPE, for_list=None,
for_parent_task=None, note=None, priority='0', starred=False,
tags=None, due=None, dueTime=None, start=None, repeat=None,
action=None, ignoreDefaults=False):
"""Create a 2DoApp-task."""
if len(task) == 0:
raise ValueError('Task title must have content!')
self.task = task
self.type = type
self.for_list = for_list
self.forParentTask = for_parent_task
self.note = note
self.priority = priority
self.starred = starred
if starred:
self.starred = '1'
else:
self.starred = '0'
self.tags = tags
self.due = due
self.dueTime = due_time
self.dueTime = dueTime
self.start = start
self.repeat = repeat
self.action = action
self.ignoreDefaults = ignore_defaults
if ignoreDefaults:
self.ignoreDefaults = '1'
else:
self.ignoreDefaults = '0'

def url(self):
"""Return the URL for the task of this object."""
urlpath = 'task=' + quote(self.task)
if self.type != '0':
urlpath += '&type={}'.format(self.type)
if self.for_list is not None:
urlpath += '&for_list={}'.format(quote(self.for_list))
return self.BASE_URL.format(urlpath)

0 comments on commit 4ae220c

Please sign in to comment.