From 78752f56adb57bb1d5672a6ac819944477b7b529 Mon Sep 17 00:00:00 2001 From: David Medina Date: Sun, 13 Nov 2011 19:29:12 +0100 Subject: Testing on fire (handlers, user_handler) Also fix bugs, pep8 --- github3/tests/handler_test.py | 53 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 github3/tests/handler_test.py (limited to 'github3/tests/handler_test.py') diff --git a/github3/tests/handler_test.py b/github3/tests/handler_test.py new file mode 100644 index 0000000..51cd111 --- /dev/null +++ b/github3/tests/handler_test.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from mock import Mock, patch +from unittest import TestCase +from github3 import api +from github3.handlers.base import Handler +from github3.exceptions import * +from github3.converters import * +import json +import requests + + +class TestHandler(TestCase): + + def setUp(self): + self.gh = api.Github() + self.handler = Handler(self.gh) + + def test_get_converter(self): + self.assertIsInstance(self.handler._get_converter(), Modelizer) + self.assertIsInstance(self.handler._get_converter(converter=Rawlizer), + Rawlizer) + self.handler.converter = Modelizer + self.assertIsInstance(self.handler._get_converter(), Modelizer) + + def test_bool(self): + with patch.object(api.Github, 'head') as head: + response = head.return_value + response.status_code = 204 + bool1 = self.handler._bool('test') + head.side_effect = NotFound() + bool2 = self.handler._bool('test') + head.assert_called_with('test') + self.assertTrue(bool1) + self.assertFalse(bool2) + + with patch.object(api.Github, 'put') as put: + response = put.return_value + response.status_code = 204 + booll = self.handler._put('test') + put.assert_called_with('test', method='put') + self.assertTrue(booll) + + with patch.object(api.Github, 'delete') as delete: + response = delete.return_value + response.content = self.gh._parser.dumps({'data': 'test'}) + response.status_code = 204 + bool1 = self.handler._bool('test', method='delete') + bool2 = self.handler._bool('test', method='delete', + data={'some': 'data'}) + self.assertTrue(bool1) + self.assertTrue(bool2) -- cgit v1.2.3-59-g8ed1b From 6323be600d0c265e40df9f8950602e85ee94955b Mon Sep 17 00:00:00 2001 From: David Medina Date: Sun, 13 Nov 2011 23:43:35 +0100 Subject: Added handler base test --- github3/tests/fixtures.py | 5 +++- github3/tests/handler_test.py | 53 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) (limited to 'github3/tests/handler_test.py') diff --git a/github3/tests/fixtures.py b/github3/tests/fixtures.py index aef4425..fdbc3fb 100644 --- a/github3/tests/fixtures.py +++ b/github3/tests/fixtures.py @@ -23,7 +23,10 @@ GET_USER = { } GET_LINK = '; rel="next", ; rel="last"' - +GET_RESOURCES = [ + {'login': 'octocat'}, + {'login': 'octocat'} +] GET_FOLLOWERS = [ { "login": "octocat", diff --git a/github3/tests/handler_test.py b/github3/tests/handler_test.py index 51cd111..e691182 100644 --- a/github3/tests/handler_test.py +++ b/github3/tests/handler_test.py @@ -7,6 +7,8 @@ from github3 import api from github3.handlers.base import Handler from github3.exceptions import * from github3.converters import * +from github3.models.user import User +from fixtures import * import json import requests @@ -51,3 +53,54 @@ class TestHandler(TestCase): data={'some': 'data'}) self.assertTrue(bool1) self.assertTrue(bool2) + + @patch.object(api.Github, '_request') + def test_get_resources(self, request): + # Simulating per_page=2 with STUB (it returns two resources) + response = request.return_value + response.status_code = 200 + response.headers = {'link': GET_LINK} + response.content = self.gh._parser.dumps(GET_RESOURCES) + resources = self.handler._get_resources('users', model=User) + self.assertFalse(request.called) + resources = list(resources) + self.assertTrue(request.call_count, 5) + request_args = ('GET', 'users') + self.assertEquals(request.call_args_list, [ + (request_args, {'page': 1}), + (request_args, {'page': 2}), + (request_args, {'page': 3}), + (request_args, {'page': 4}), + (request_args, {'page': 5})]) + self.assertEquals(len(resources), 10) + self.assertEquals(resources[0].login, 'octocat') + + request.reset_mock() + resources = self.handler._get_resources('users', model=User, limit=5) + resources = list(resources) + self.assertEquals(request.call_count, 3) + self.assertEquals(len(resources), 5) + request.reset_mock() + resources = self.handler._get_resources('users', model=User, limit=4) + resources = list(resources) + self.assertEquals(request.call_count, 2) + self.assertEquals(len(resources), 4) + request.reset_mock() + resources = self.handler._get_resources('users', model=User, limit=-5) + resources = list(resources) + self.assertEquals(request.call_count, 3) + self.assertEquals(len(resources), 5) + + @patch.object(api.Github, 'get') + def test_get_resource(self, get): + # Converter test + api(get) test. Half trivial + get.return_value = {'login': 'octocat'} + model = self.handler._get_resource('test', model=User) + self.assertEquals(model.login, 'octocat') + + @patch.object(api.Github, 'post') + def test_post_resource(self, post): + post.return_value = {'data': 'posted'} + data = {'data': 'to_post'} + user_new = self.handler._post_resource('test', data=data, model=User) + post.assert_called_with('test', data=data) -- cgit v1.2.3-59-g8ed1b From 8060db65c51d551107eff76bf4e94ef82d9f869b Mon Sep 17 00:00:00 2001 From: David Medina Date: Mon, 28 Nov 2011 01:07:42 +0100 Subject: MimeType mixin --- github3/handlers/base.py | 32 ++++++++++++++++++++++++++++++++ github3/handlers/users.py | 2 +- github3/tests/handler_test.py | 24 +++++++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) (limited to 'github3/tests/handler_test.py') diff --git a/github3/handlers/base.py b/github3/handlers/base.py index a85ce20..7bc55d2 100644 --- a/github3/handlers/base.py +++ b/github3/handlers/base.py @@ -4,6 +4,38 @@ from github3.core import Paginate from github3.converters import Modelizer + +class MimeTypeMixin(object): + + VERSION = 'beta' + + def __init__(self): + self.mimetypes = set() + + def _parse_mime_type(self, type): + return 'application/vnd.github.%s.%s+json' % ( + self.VERSION, type) + + def add_raw(self): + self.mimetypes.add(self._parse_mime_type('raw')) + return self + + def add_text(self): + self.mimetypes.add(self._parse_mime_type('text')) + return self + + def add_html(self): + self.mimetypes.add(self._parse_mime_type('html')) + return self + + def add_full(self): + self.mimetypes.add(self._parse_mime_type('full')) + return self + + def mime_header(self): + return {'Accept': ', '.join(self.mimetypes)} + + class Handler(object): """ Handler base. Requests to API and modelize responses """ diff --git a/github3/handlers/users.py b/github3/handlers/users.py index ec40f02..92eea6f 100644 --- a/github3/handlers/users.py +++ b/github3/handlers/users.py @@ -2,7 +2,7 @@ # -*- encoding: utf-8 -*- from .base import Handler -import github3.models as models +from github3 import models from github3.converters import Rawlizer from github3.exceptions import UserIsAnonymous diff --git a/github3/tests/handler_test.py b/github3/tests/handler_test.py index e691182..e95374b 100644 --- a/github3/tests/handler_test.py +++ b/github3/tests/handler_test.py @@ -4,7 +4,7 @@ from mock import Mock, patch from unittest import TestCase from github3 import api -from github3.handlers.base import Handler +from github3.handlers.base import Handler, MimeTypeMixin from github3.exceptions import * from github3.converters import * from github3.models.user import User @@ -13,6 +13,28 @@ import json import requests +class TestMimeTypeMixin(TestCase): + + def setUp(self): + self.mixin = MimeTypeMixin() + + def _parse_mime_type(self, type): + return 'application/vnd.github.%s.%s+json' % ( + MimeTypeMixin.VERSION, type) + + def test_add_mimetypes(self): + self.mixin.add_raw() + self.mixin.add_text() + self.mixin.add_html() + self.mixin.add_full() + self.assertEquals(sorted(self.mixin.mime_header()), sorted({ + 'Accept': '%s, %s, %s, %s' % ( + self._parse_mime_type('raw'), + self._parse_mime_type('text'), + self._parse_mime_type('html'), + self._parse_mime_type('full'))})) + + class TestHandler(TestCase): def setUp(self): -- cgit v1.2.3-59-g8ed1b From f5ab0a9c6f35950e09e3c4fa0f908c1fc477cf33 Mon Sep 17 00:00:00 2001 From: David Medina Date: Wed, 30 Nov 2011 00:07:05 +0100 Subject: Fix get_converter to delete converter in kwargs It doesn't matter if converter is populate in kwargs to requests but it's more elegant and simplify tests --- github3/handlers/base.py | 12 ++++++------ github3/tests/handler_test.py | 4 +++- 2 files changed, 9 insertions(+), 7 deletions(-) (limited to 'github3/tests/handler_test.py') diff --git a/github3/handlers/base.py b/github3/handlers/base.py index b20bb7d..e36a08a 100644 --- a/github3/handlers/base.py +++ b/github3/handlers/base.py @@ -53,8 +53,8 @@ class Handler(object): prefix = getattr(self, 'prefix', '') return '/'.join((prefix, str(resource))).strip('/') - def _get_converter(self, **kwargs): - converter = kwargs.get( + def _get_converter(self, kwargs={}): + converter = kwargs.pop( 'converter', # 1. in kwargs getattr(self, 'converter', # 2. in handler Modelizer)) # 3. Default @@ -91,11 +91,11 @@ class Handler(object): if limit: limit = abs(limit) resource = self._prefix_resource(resource) + converter = self._get_converter(kwargs) counter = 1 for page in Paginate(resource, self._gh.get, **kwargs): for raw_resource in page: counter += 1 - converter = self._get_converter(**kwargs) converter.inject(model) yield converter.loads(raw_resource) if limit and counter > limit: @@ -108,8 +108,8 @@ class Handler(object): """ Handler request to single resource """ resource = self._prefix_resource(resource) - raw_resource = self._gh.get(resource) - converter = self._get_converter(**kwargs) + converter = self._get_converter(kwargs) + raw_resource = self._gh.get(resource, **kwargs) converter.inject(model) return converter.loads(raw_resource) @@ -118,6 +118,6 @@ class Handler(object): resource = self._prefix_resource(resource) raw_resource = self._gh.post(resource, data=data) - converter = self._get_converter(**kwargs) + converter = self._get_converter(kwargs) converter.inject(model) return converter.loads(raw_resource) diff --git a/github3/tests/handler_test.py b/github3/tests/handler_test.py index e95374b..4dbe77a 100644 --- a/github3/tests/handler_test.py +++ b/github3/tests/handler_test.py @@ -43,8 +43,10 @@ class TestHandler(TestCase): def test_get_converter(self): self.assertIsInstance(self.handler._get_converter(), Modelizer) - self.assertIsInstance(self.handler._get_converter(converter=Rawlizer), + kwargs = {'converter': Rawlizer} + self.assertIsInstance(self.handler._get_converter(kwargs), Rawlizer) + self.assertEquals(kwargs, {}) self.handler.converter = Modelizer self.assertIsInstance(self.handler._get_converter(), Modelizer) -- cgit v1.2.3-59-g8ed1b From 3547813022e7f5da658e74317ca62849609b5d24 Mon Sep 17 00:00:00 2001 From: David Medina Date: Wed, 30 Nov 2011 00:15:25 +0100 Subject: Fix mime_header to return None if needed --- github3/handlers/base.py | 4 +++- github3/tests/handler_test.py | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'github3/tests/handler_test.py') diff --git a/github3/handlers/base.py b/github3/handlers/base.py index e36a08a..565978f 100644 --- a/github3/handlers/base.py +++ b/github3/handlers/base.py @@ -33,7 +33,9 @@ class MimeTypeMixin(object): return self def mime_header(self): - return {'Accept': ', '.join(self.mimetypes)} + if self.mimetypes: + return {'Accept': ', '.join(self.mimetypes)} + return None class Handler(object): diff --git a/github3/tests/handler_test.py b/github3/tests/handler_test.py index 4dbe77a..83c89ef 100644 --- a/github3/tests/handler_test.py +++ b/github3/tests/handler_test.py @@ -22,6 +22,9 @@ class TestMimeTypeMixin(TestCase): return 'application/vnd.github.%s.%s+json' % ( MimeTypeMixin.VERSION, type) + def test_header(self): + self.assertEquals(self.mixin.mime_header(), None) + def test_add_mimetypes(self): self.mixin.add_raw() self.mixin.add_text() -- cgit v1.2.3-59-g8ed1b