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 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 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 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