2019-01-19 23:24:53 -06:00
|
|
|
import uuid
|
|
|
|
import datetime
|
|
|
|
import pytest
|
|
|
|
import sys
|
|
|
|
import mock
|
|
|
|
from twservices.apps import RestService, TaskService
|
|
|
|
from pytest_mock import mocker
|
|
|
|
|
|
|
|
|
|
|
|
sys.path.append(".")
|
|
|
|
|
|
|
|
from twservices.apps.grocy import Grocy
|
|
|
|
|
|
|
|
#def test_get_grocy_tw_tasks(mocker, test_mock_tw_instance):
|
|
|
|
# expect_filters = {
|
|
|
|
# 'and': [('%s.any' % key, none) for key in list(grocy.udas.keys())],
|
|
|
|
# 'or': [('status', 'pending'), ('status', 'waiting')]
|
|
|
|
# }
|
|
|
|
# mocker.spy(test_mock_tw_instance, 'filter_tasks')
|
|
|
|
#
|
|
|
|
# grocy = grocy()
|
|
|
|
# grocy.set_taskwarrior(test_mock_tw_instance)
|
|
|
|
# actual_tasks = grocy.get_grocy_tw_tasks()
|
|
|
|
#
|
|
|
|
# assert actual_tasks is not none
|
|
|
|
# assert grocy.get_grocy_tw_tasks.called.assert_called_with(expect_filters) is true
|
|
|
|
|
|
|
|
@pytest.fixture(scope='function')
|
|
|
|
def setup_grocy_args():
|
|
|
|
grocy_args = {
|
|
|
|
'token': 'e96a89a5',
|
|
|
|
'api': 'http://example.grocy.com',
|
|
|
|
'category': 'grocy'
|
|
|
|
}
|
|
|
|
return grocy_args
|
|
|
|
|
2019-01-21 00:53:06 -06:00
|
|
|
class mockTW(object):
|
|
|
|
def task_add(self, **kwargs):
|
|
|
|
pass
|
|
|
|
def task_update(self, **kwargs):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
|
|
def setup_tw():
|
|
|
|
tw = mockTw()
|
|
|
|
return tw
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-01-19 23:24:53 -06:00
|
|
|
|
|
|
|
def test_get_category(mocker, setup_grocy_args):
|
|
|
|
expected_category = setup_grocy_args['category']
|
|
|
|
expected_token = setup_grocy_args['token']
|
|
|
|
expected_grocy_categories = [{'name': expected_category}, {'name': 'test'}]
|
|
|
|
|
|
|
|
mocker.patch.object(RestService, '__init__')
|
|
|
|
mocker.patch.object(RestService, 'get')
|
|
|
|
mocker.patch.object(RestService, 'addHeader')
|
|
|
|
RestService.__init__.return_value = None
|
|
|
|
RestService.get.return_value = expected_grocy_categories
|
|
|
|
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
actual_category = grocy.get_category()
|
|
|
|
RestService.addHeader.assert_called_with(Grocy.API_KEY_HEADER, expected_token)
|
|
|
|
assert actual_category == {'name': expected_category }
|
|
|
|
|
|
|
|
def test_create_category(mocker, setup_grocy_args):
|
|
|
|
expected_category = setup_grocy_args['category']
|
|
|
|
expected_post_response = {'success': True, 'error': ''}
|
|
|
|
|
|
|
|
mocker.patch.object(RestService, '__init__')
|
|
|
|
mocker.patch.object(RestService, 'post')
|
|
|
|
mocker.patch.object(RestService, 'addHeader')
|
|
|
|
RestService.__init__.return_value = None
|
|
|
|
RestService.post.return_value = expected_post_response
|
|
|
|
mocker.patch.object(RestService, 'addHeader')
|
|
|
|
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
grocy.create_category()
|
|
|
|
RestService.post.assert_called_with(Grocy.ADD_CATEGORY_ENDPOINT, expected_category)
|
|
|
|
|
|
|
|
def test_to_grocy(mocker, setup_grocy_args):
|
|
|
|
mocker.patch.object(Grocy, 'get_category')
|
|
|
|
notes_arr = ['This is line1', 'This is line2']
|
|
|
|
notes_string = ''
|
|
|
|
entry_time = datetime.time(18,22,00)
|
|
|
|
entry_date = datetime.date(2019,1,16)
|
|
|
|
due_time = datetime.time(18,26,00)
|
|
|
|
due_date = datetime.date(2019,1,20)
|
|
|
|
for note in notes_arr:
|
|
|
|
notes_string+= '{}\n'.format(note)
|
|
|
|
|
|
|
|
expected_task = {
|
|
|
|
Grocy.UDA_GROCY_ID: '1337',
|
|
|
|
Grocy.UDA_GROCY_ASSIGNED_TO_USER_ID : '1',
|
|
|
|
TaskService.UUID: '1a727026-9611-4d8e-ba4d-d5dc6eaf7054',
|
|
|
|
TaskService.DESCRIPTION: 'This is a task from taskwarrior',
|
|
|
|
TaskService.TAGS : setup_grocy_args['category'],
|
|
|
|
TaskService.ANNOTATIONS: notes_arr,
|
|
|
|
TaskService.ENTRY: datetime.datetime.combine(entry_date,entry_time),
|
|
|
|
TaskService.DUE: datetime.datetime.combine(entry_date,entry_time),
|
|
|
|
TaskService.DONE: '1'
|
|
|
|
}
|
|
|
|
expected_grocy_task = {
|
|
|
|
Grocy.ID : expected_task[Grocy.UDA_GROCY_ID],
|
|
|
|
Grocy.UDA_GROCY_TW_UUID: expected_task[TaskService.UUID],
|
|
|
|
Grocy.ASSIGNED_TO_USER_ID: expected_task[Grocy.UDA_GROCY_ASSIGNED_TO_USER_ID],
|
|
|
|
Grocy.NAME: expected_task[TaskService.DESCRIPTION],
|
|
|
|
Grocy.CATEGORY: expected_task[TaskService.TAGS],
|
|
|
|
Grocy.DESCRIPTION: notes_string,
|
|
|
|
Grocy.ROW_CREATED_TIMESTAMP: expected_task[TaskService.ENTRY].strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
|
Grocy.DUE_DATE: expected_task[TaskService.DUE].strftime('%Y-%m-%d'),
|
|
|
|
Grocy.DONE: expected_task[TaskService.DONE]
|
|
|
|
}
|
|
|
|
|
|
|
|
Grocy.get_category.return_value = {'name': setup_grocy_args['category']}
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
actual_grocy_task = grocy.to_grocy(expected_task)
|
|
|
|
assert expected_grocy_task == actual_grocy_task
|
|
|
|
|
2019-01-21 00:53:06 -06:00
|
|
|
def test_to_taskwarrior(mocker, setup_grocy_args):
|
|
|
|
mocker.patch.object(Grocy, 'get_category')
|
|
|
|
notes_arr = ['This is line1', 'This is line2']
|
|
|
|
notes_string = ''
|
|
|
|
entry_time = datetime.time(18,22,00)
|
|
|
|
entry_date = datetime.date(2019,1,16)
|
|
|
|
due_time = datetime.time(18,26,00)
|
|
|
|
due_date = datetime.date(2019,1,20)
|
|
|
|
for note in notes_arr:
|
|
|
|
notes_string+= '{}\n'.format(note)
|
|
|
|
|
|
|
|
expected_grocy_task = {
|
|
|
|
Grocy.ID : '1337',
|
|
|
|
Grocy.UDA_GROCY_TW_UUID: 'c9ce6ba3-973a-49d7-b7bd-4ff88ee464d9',
|
|
|
|
Grocy.ASSIGNED_TO_USER_ID: '1',
|
|
|
|
Grocy.NAME: 'This is a task from grocy',
|
|
|
|
Grocy.CATEGORY: setup_grocy_args['category'],
|
|
|
|
Grocy.DESCRIPTION: notes_string,
|
|
|
|
Grocy.ROW_CREATED_TIMESTAMP: datetime.datetime.combine(entry_date,entry_time),
|
|
|
|
Grocy.DUE_DATE: datetime.datetime.combine(entry_date,entry_time),
|
|
|
|
Grocy.DONE: '1'
|
|
|
|
}
|
|
|
|
expected_task = {
|
|
|
|
Grocy.UDA_GROCY_ID: expected_grocy_task[Grocy.ID],
|
|
|
|
Grocy.UDA_GROCY_ASSIGNED_TO_USER_ID : expected_grocy_task[Grocy.ASSIGNED_TO_USER_ID],
|
|
|
|
TaskService.UUID: expected_grocy_task[Grocy.UDA_GROCY_TW_UUID],
|
|
|
|
TaskService.DESCRIPTION: expected_grocy_task[Grocy.NAME],
|
|
|
|
TaskService.TAGS : [setup_grocy_args['category']],
|
|
|
|
TaskService.ANNOTATIONS: notes_arr,
|
|
|
|
TaskService.ENTRY: expected_grocy_task[Grocy.ROW_CREATED_TIMESTAMP],
|
|
|
|
TaskService.DUE: expected_grocy_task[Grocy.DUE_DATE],
|
|
|
|
TaskService.STATUS: TaskService.COMPLETED
|
|
|
|
}
|
|
|
|
|
|
|
|
Grocy.get_category.return_value = {'name': setup_grocy_args['category']}
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
actual_task = grocy.to_taskwarrior(expected_grocy_task)
|
|
|
|
assert expected_task == actual_task
|
|
|
|
|
|
|
|
def test_find_all(mocker, setup_grocy_args):
|
|
|
|
mocker.patch.object(RestService, '__init__')
|
|
|
|
mocker.patch.object(RestService, 'get')
|
|
|
|
mocker.patch.object(RestService, 'addHeader')
|
|
|
|
expected_grocy_tasks = [
|
|
|
|
{ 'id': 1, 'name': 'This is a grocy task 1' },
|
|
|
|
{ 'id': 2, 'name': 'This is a grocy task 2' }
|
|
|
|
]
|
|
|
|
RestService.get.return_value = expected_grocy_tasks
|
|
|
|
RestService.__init__.return_value = None
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
actual_grocy_tasks = grocy.find_all()
|
|
|
|
|
|
|
|
RestService.addHeader.assert_called_with(Grocy.API_KEY_HEADER, setup_grocy_args['token'])
|
|
|
|
RestService.get.assert_called_with(Grocy.FIND_ALL_TASKS_ENDPOINT)
|
|
|
|
assert actual_grocy_tasks == expected_grocy_tasks
|
|
|
|
|
|
|
|
def test_delete_success(mocker, setup_grocy_args):
|
|
|
|
mocker.patch.object(RestService, '__init__')
|
|
|
|
mocker.patch.object(RestService, 'get')
|
|
|
|
mocker.patch.object(RestService, 'addHeader')
|
|
|
|
expected_grocy_task_id = 1
|
|
|
|
expected_delete_response = { 'success': True, 'error_message': '' }
|
|
|
|
RestService.get.return_value = expected_delete_response
|
|
|
|
RestService.__init__.return_value = None
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
actual_delete_response = grocy.delete(expected_grocy_task_id)
|
|
|
|
|
|
|
|
RestService.addHeader.assert_called_with(Grocy.API_KEY_HEADER, setup_grocy_args['token'])
|
|
|
|
RestService.get.assert_called_with(Grocy.DELETE_TASK_ENDPOINT, expected_grocy_task_id)
|
|
|
|
assert actual_delete_response == expected_delete_response
|
|
|
|
|
|
|
|
def test_add_success_single(mocker, setup_grocy_args):
|
|
|
|
mocker.patch.object(RestService, '__init__')
|
|
|
|
mocker.patch.object(RestService, 'post')
|
|
|
|
mocker.patch.object(RestService, 'addHeader')
|
|
|
|
expected_grocy_task = { 'id': 1, 'name': 'This is a grocy task 1' },
|
|
|
|
expected_grocy_tasks = []
|
|
|
|
expected_grocy_tasks.append(expected_grocy_task)
|
|
|
|
|
|
|
|
RestService.post.return_value = expected_grocy_task
|
|
|
|
RestService.__init__.return_value = None
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
actual_grocy_tasks = grocy.add(expected_grocy_task)
|
|
|
|
|
|
|
|
RestService.addHeader.assert_called_with(Grocy.API_KEY_HEADER, setup_grocy_args['token'])
|
|
|
|
RestService.post.assert_called_with(Grocy.ADD_TASK_ENDPOINT, expected_grocy_task)
|
|
|
|
assert type(actual_grocy_tasks) == list
|
|
|
|
assert len(actual_grocy_tasks) == 1
|
|
|
|
assert actual_grocy_tasks == expected_grocy_tasks
|
|
|
|
|
|
|
|
def test_modify_success_single(mocker, setup_grocy_args):
|
|
|
|
mocker.patch.object(RestService, '__init__')
|
|
|
|
mocker.patch.object(RestService, 'post')
|
|
|
|
mocker.patch.object(RestService, 'addHeader')
|
|
|
|
expected_modify_responses = []
|
|
|
|
expected_modify_response = { 'success': True, 'error_message': '' }
|
|
|
|
expected_modify_responses.append(expected_modify_response)
|
|
|
|
expected_modify_grocy_task_id = 1
|
|
|
|
expected_modify_endpoint = '{0}/{1}'.format(Grocy.MODIFY_TASK_ENDPOINT, expected_modify_grocy_task_id)
|
|
|
|
expected_modify_grocy_task = { 'id': expected_modify_grocy_task_id, 'name': 'This is a modified grocy task 1' }
|
|
|
|
expected_modify_grocy_tasks = []
|
|
|
|
expected_modify_grocy_tasks.append(expected_modify_grocy_task)
|
|
|
|
|
|
|
|
RestService.post.return_value = expected_modify_response
|
|
|
|
RestService.__init__.return_value = None
|
|
|
|
grocy = Grocy(**setup_grocy_args)
|
|
|
|
actual_modify_responses = grocy.modify(expected_modify_grocy_tasks)
|
|
|
|
|
|
|
|
RestService.addHeader.assert_called_with(Grocy.API_KEY_HEADER, setup_grocy_args['token'])
|
|
|
|
RestService.post.assert_called_with(expected_modify_endpoint, expected_modify_grocy_task)
|
|
|
|
assert type(actual_modify_responses) == list
|
|
|
|
assert len(actual_modify_responses) == 1
|
|
|
|
assert actual_modify_responses == expected_modify_responses
|
|
|
|
|
|
|
|
#def test_merge_from_tw(mocker, setup_grocy_args, setup_tw):
|
|
|
|
# notes_string = ''
|
|
|
|
# updated_string = 'This is a new note'
|
|
|
|
# notes_arr = ['This is line1', 'This is line2']
|
|
|
|
# updated_arr = deepclone(notes_arr)
|
|
|
|
# updated_arr.append(updated_string)
|
|
|
|
# for note in notes_arr:
|
|
|
|
# notes_string+= '{}\n'.format(note)
|
|
|
|
# updated_notes_string+='This is a new note\n'
|
|
|
|
# mocker.patch.object(Grocy, 'to_grocy')
|
|
|
|
# mocker.patch.object(Grocy, 'to_taskwarrior')
|
|
|
|
# mocker.patch.object(mockTw, 'task_add')
|
|
|
|
# grocy_tasks = [{
|
|
|
|
# Grocy.ID : '1337',
|
|
|
|
# Grocy.UDA_GROCY_TW_UUID: 'c9ce6ba3-973a-49d7-b7bd-4ff88ee464d9',
|
|
|
|
# Grocy.ASSIGNED_TO_USER_ID: '1',
|
|
|
|
# Grocy.NAME: 'This is a new task from grocy',
|
|
|
|
# Grocy.CATEGORY: setup_grocy_args['category'],
|
|
|
|
# Grocy.DESCRIPTION: updated_notes_string,
|
|
|
|
# Grocy.ROW_CREATED_TIMESTAMP: datetime.datetime.combine(entry_date,entry_time),
|
|
|
|
# Grocy.DUE_DATE: datetime.datetime.combine(entry_date,entry_time),
|
|
|
|
# Grocy.DONE: '1'
|
|
|
|
# }]
|
|
|
|
# tw_tasks = [{
|
|
|
|
# Grocy.UDA_GROCY_ID: grocy_tasks[0][Grocy.ID],
|
|
|
|
# Grocy.UDA_GROCY_ASSIGNED_TO_USER_ID : '2',
|
|
|
|
# TaskService.UUID: grocy_tasks[0][Grocy.UDA_GROCY_TW_UUID]
|
|
|
|
# TaskService.DESCRIPTION: 'This was the old task from grocy'
|
|
|
|
# TaskService.TAGS : [setup_grocy_args['category']],
|
|
|
|
# TaskService.ANNOTATIONS: notes_arr,
|
|
|
|
# TaskService.ENTRY: expected_grocy_task[Grocy.ROW_CREATED_TIMESTAMP],
|
|
|
|
# TaskService.DUE: expected_grocy_task[Grocy.DUE_DATE],
|
|
|
|
# TaskService.STATUS: TaskService.COMPLETED
|
|
|
|
# }]
|
|
|
|
#
|
|
|
|
# expected_modify_responses = []
|
|
|
|
# expected_modify_response = { 'success': True, 'error_message': '' }
|
|
|
|
# expected_modify_responses.append(expected_modify_response)
|
|
|
|
# expected_modify_grocy_task_id = 1
|
|
|
|
# expected_modify_endpoint = '{0}/{1}'.format(Grocy.MODIFY_TASK_ENDPOINT, expected_modify_grocy_task_id)
|
|
|
|
# expected_modify_grocy_task = { 'id': expected_modify_grocy_task_id, 'name': 'This is a modified grocy task 1' }
|
|
|
|
# expected_modify_grocy_tasks = []
|
|
|
|
# expected_modify_grocy_tasks.append(expected_modify_grocy_task)
|
|
|
|
#
|
|
|
|
# RestService.post.return_value = expected_modify_response
|
|
|
|
# RestService.__init__.return_value = None
|
|
|
|
# grocy = Grocy(**setup_grocy_args)
|
|
|
|
# actual_modify_responses = grocy.modify(expected_modify_grocy_tasks)
|
|
|
|
#
|
|
|
|
# RestService.addHeader.assert_called_with(Grocy.API_KEY_HEADER, setup_grocy_args['token'])
|
|
|
|
# RestService.post.assert_called_with(expected_modify_endpoint, expected_modify_grocy_task)
|
|
|
|
# assert type(actual_modify_responses) == list
|
|
|
|
# assert len(actual_modify_responses) == 1
|
|
|
|
# assert actual_modify_responses == expected_modify_responses
|
|
|
|
|