aboutsummaryrefslogtreecommitdiffstats
path: root/github3/tests/handler_test.py
blob: 83c89ef0de6c012103051451cea91776451d19ae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/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, MimeTypeMixin
from github3.exceptions import *
from github3.converters import *
from github3.models.user import User
from fixtures import *
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_header(self):
        self.assertEquals(self.mixin.mime_header(), None)

    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):
        self.gh = api.Github()
        self.handler = Handler(self.gh)

    def test_get_converter(self):
        self.assertIsInstance(self.handler._get_converter(), Modelizer)
        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)

    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)

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