def setUp(self):
     self.faker = Factory.create()
     self.sailthru_key = self.faker.password()
     self.sailthru_secret = self.faker.password()
     self.content_url_root = 'http://' + self.faker.domain_name()
     self.sailthru_client = SailthruApiService(self.sailthru_key, self.sailthru_secret, self.content_url_root)
     self.mock_sailthru_list = {
         'content': [
             {
                 "url": "http://" + self.faker.domain_name()
             },
             {
                 "url": "http://" + self.faker.domain_name()
             },
         ]
     }
class SailthruApiServiceTests(unittest.TestCase):
    def setUp(self):
        self.faker = Factory.create()
        self.sailthru_key = self.faker.password()
        self.sailthru_secret = self.faker.password()
        self.content_url_root = 'http://' + self.faker.domain_name()
        self.sailthru_client = SailthruApiService(self.sailthru_key, self.sailthru_secret, self.content_url_root)
        self.mock_sailthru_list = {
            'content': [
                {
                    "url": "http://" + self.faker.domain_name()
                },
                {
                    "url": "http://" + self.faker.domain_name()
                },
            ]
        }

    def _get_api_get_response_mock(self, is_ok_value, side_effect):
        get_response_mock = mock.Mock()
        get_response_mock.is_ok.return_value = is_ok_value
        json_property = mock.PropertyMock(side_effect=side_effect)
        type(get_response_mock).json = json_property
        return get_response_mock

    @mock.patch('sailthru.sailthru_client.SailthruClient.api_get')
    def test_list_success(self, mock_api_get):
        get_response_mock = self._get_api_get_response_mock(True, [self.mock_sailthru_list])
        mock_api_get.return_value = get_response_mock
        sailthru_item_collection = self.sailthru_client.list()
        self.assertEqual(len(sailthru_item_collection), len(self.mock_sailthru_list['content']))

    @mock.patch('sailthru.sailthru_client.SailthruClient.api_get')
    @mock.patch('logging.error')
    def test_list_error(self, mock_error_log, mock_api_get):
        error_result = {
            'errormsg': 'mock error message',
            'error': 22
        }
        mock_get_result = mock.Mock(json=error_result)
        mock_get_result.is_ok.return_value = False
        mock_api_get.return_value = mock_get_result
        sailthru_item_collection = self.sailthru_client.list()
        self.assertEqual(len(sailthru_item_collection), 0)
        self.assertTrue(mock_error_log.called)

    @mock.patch('sailthru.sailthru_client.SailthruClient.api_get')
    @mock.patch('sailthru.sailthru_client.SailthruClient.api_delete')
    def test_clear_success(self, mock_api_delete, mock_api_get):
        get_response_mock = self._get_api_get_response_mock(True, [self.mock_sailthru_list, {'content': []}])
        mock_api_get.return_value = get_response_mock

        delete_response_mock = mock.Mock()
        delete_response_mock.is_ok.return_value = True
        mock_api_delete.return_value = delete_response_mock
        self.sailthru_client.clear()
        self.assertTrue(mock_api_get.called)
        self.assertTrue(mock_api_delete.called)
        self.assertTrue(get_response_mock.is_ok.called)
        self.assertTrue(delete_response_mock.is_ok.called)

    @mock.patch('sailthru.sailthru_client.SailthruClient.api_get')
    def test_clear_no_item(self, mock_api_get):
        get_response_mock = self._get_api_get_response_mock(True, [self.mock_sailthru_list, {'content': []}])
        mock_api_get.return_value = get_response_mock

        self.sailthru_client.clear()
        self.assertTrue(mock_api_get.called)
        self.assertTrue(get_response_mock.is_ok.called)

    @mock.patch('sailthru.sailthru_client.SailthruClient.api_get')
    @mock.patch('sailthru.sailthru_client.SailthruClient.api_delete')
    def test_clear_delete_error(self, mock_api_delete, mock_api_get):
        get_response_mock = self._get_api_get_response_mock(True, [self.mock_sailthru_list, {'content': []}])
        mock_api_get.return_value = get_response_mock

        delete_response_mock = mock.Mock()
        delete_response_mock.is_ok.return_value = False
        mock_api_delete.return_value = delete_response_mock
        self.sailthru_client.clear()
        self.assertTrue(mock_api_get.called)
        self.assertTrue(mock_api_delete.called)
        self.assertTrue(get_response_mock.is_ok.called)
        self.assertTrue(delete_response_mock.is_ok.called)

    @mock.patch('sailthru.sailthru_client.SailthruClient.api_get')
    @mock.patch('sailthru.sailthru_client.SailthruClient.api_post')
    @mock.patch('time.sleep')
    def test_upload_batch_file_success(self, mock_sleep, mock_api_post, mock_api_get):
        mock_job_id = str(self.faker.pyint())
        get_response_mock = mock.Mock()
        get_response_mock.get_body.side_effect = [
            {'status': 'InProgress'},
            {'status': 'completed'},
        ]
        mock_api_get.return_value = get_response_mock

        post_response_mock = mock.Mock()
        post_response_mock.is_ok.return_value = True
        post_response_mock.get_body.return_value = {'job_id': mock_job_id}
        mock_api_post.return_value = post_response_mock

        mock_sleep.return_value = True

        self.sailthru_client._upload_batch_file(self.faker.uri_path())
        self.assertTrue(mock_api_post.called)
        self.assertTrue(mock_api_get.called)

    @mock.patch('logging.error')
    @mock.patch('sailthru.sailthru_client.SailthruClient.api_post')
    def test_upload_batch_file_failure(self, mock_api_post, mock_error_log):
        error_mock = mock.Mock()
        error_mock.get_message.return_value = 'Test error'
        error_mock.get_status_code.return_value = 500
        error_mock.get_error_code.return_value = 'Test error code'
        post_response_mock = mock.Mock()
        post_response_mock.is_ok.return_value = False
        post_response_mock.get_error.return_value = error_mock
        mock_api_post.return_value = post_response_mock

        self.sailthru_client._upload_batch_file(self.faker.uri_path())
        self.assertTrue(mock_error_log.called)