Source code for helpscout.tests.test_base_api

# -*- coding: utf-8 -*-
# Copyright 2017-TODAY LasLabs Inc.
# License MIT (https://opensource.org/licenses/MIT).

import mock
import unittest

from .. import BaseApi
from .. import BaseModel
from ..domain import Domain
from ..request_paginator import RequestPaginator


PAGINATOR = 'helpscout.base_api.RequestPaginator'


[docs]class TestApi(BaseApi): __object__ = BaseModel
[docs]class TestBaseApi(unittest.TestCase): ENDPOINT = '/endpoint' DATA = {'test': 1234} REQUEST_TYPE = RequestPaginator.POST
[docs] def new_api(self, endpoint=ENDPOINT, data=DATA, request_type=REQUEST_TYPE, singleton=False, session=None, out_type=None): return TestApi( endpoint, data, request_type, singleton, session, out_type, )
[docs] def test_new(self): """It should return a new TestApi instance.""" self.assertIsInstance(self.new_api(), TestApi)
[docs] def test_new_paginator(self): """It should return a new API object with a paginator.""" self.assertIsInstance(self.new_api().paginator, RequestPaginator)
[docs] def test_new_paginator_create(self): """It should create the paginator with the proper args.""" session = 'session' with mock.patch.object(RequestPaginator, '__init__') as init: init.return_value = None self.new_api(session=session) init.assert_called_once_with( endpoint='https://api.helpscout.net/v1%s' % self.ENDPOINT, data=self.DATA, output_type=TestApi.__object__.from_api, request_type=self.REQUEST_TYPE, session=session, )
[docs] @mock.patch(PAGINATOR) def test_new_paginator_singleton(self, paginator): """It should return the record if singleton and found.""" paginator().call.return_value = [{'id': 9876}] res = self.new_api(singleton=True) self.assertIsInstance(res, BaseModel) self.assertEqual(res.id, 9876)
[docs] @mock.patch(PAGINATOR) def test_new_paginator_singleton_not_found(self, paginator): """It should return None if singleton and not found.""" paginator().call.return_value = [] res = self.new_api(singleton=True) self.assertIs(res, None)
[docs] @mock.patch(PAGINATOR) def test_new_paginator_singleton_none(self, paginator): """It should return None if singleton and return value is None.""" paginator().call.return_value = None res = self.new_api(singleton=True) self.assertIs(res, None)
[docs] @mock.patch(PAGINATOR) def test_base_api_iterates_paginator(self, paginator): """It should pass iteration to the paginator.""" expect = [BaseModel(id=1), BaseModel(id=2)] paginator().call.return_value = expect for idx, value in enumerate(self.new_api()): self.assertEqual(value, expect[idx])
[docs] @mock.patch(PAGINATOR) def test_new_paginator_singleton_out_type(self, paginator): """It should return an object of the correct type if defined.""" paginator().call.return_value = [{'id': 9876}] res = self.new_api(singleton=True, out_type=mock.MagicMock()) self.assertIsInstance(res, mock.MagicMock)
[docs] def test_get_search_domain_domain(self): """It should return the input if it is a `Domain` obj.""" expect = Domain() self.assertEqual(BaseApi.get_search_domain(expect), expect)
[docs] def test_get_search_domain_tuple(self): """It should return the input if it is a `Domain` obj.""" expect = [('state', True)] with mock.patch.object(Domain, 'from_tuple') as from_tuple: res = BaseApi.get_search_domain(expect) from_tuple.assert_called_once_with(expect) self.assertEqual(res, from_tuple())
[docs] def test_new_object(self): """It should return the proper object.""" expect = 123 res = BaseApi.new_object({'id': expect}) self.assertIsInstance(res, BaseModel) self.assertEqual(res.id, expect)