Start testing - toot - Unnamed repository; edit this file 'description' to name the repository.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 7e31c57a63b21603233a57384ee82097a4e4ff2f
 (DIR) parent 3f1e8682c9e18aa962a83bf04e8454339e52106d
 (HTM) Author: Ivan Habunek <ivan@habunek.com>
       Date:   Sat, 15 Apr 2017 14:46:22 +0200
       
       Start testing
       
       Diffstat:
         .travis.yml                         |      15 +++++++++++++++
         tests/test_api.py                   |      64 +++++++++++++++++++++++++++++++
         tests/test_console.py               |      75 +++++++++++++++++++++++++++++++
         tests/utils.py                      |      10 ++++++++++
         toot/__init__.py                    |       9 +++++++--
       
       5 files changed, 171 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/.travis.yml b/.travis.yml
       @@ -0,0 +1,15 @@
       +language: python
       +
       +python:
       +  - "2.6"
       +  - "2.7"
       +  - "3.3"
       +  - "3.4"
       +  - "3.5"
       +  - "3.6"
       +  - "nightly"
       +
       +install:
       +  - pip install -e .
       +
       +script: py.test
 (DIR) diff --git a/tests/test_api.py b/tests/test_api.py
       @@ -0,0 +1,64 @@
       +# import pytest
       +import requests
       +
       +from toot import App, User, create_app, login, CLIENT_NAME, CLIENT_WEB, SCOPES
       +
       +
       +class MockResponse:
       +    def __init__(self, response_data={}):
       +        self.response_data = response_data
       +
       +    def raise_for_status(self):
       +        pass
       +
       +    def json(self):
       +        return self.response_data
       +
       +
       +def test_create_app(monkeypatch):
       +    def mock_post(url, data):
       +        assert url == 'https://bigfish.software/api/v1/apps'
       +        assert data == {
       +            'website': CLIENT_WEB,
       +            'client_name': CLIENT_NAME,
       +            'scopes': SCOPES,
       +            'redirect_uris': 'urn:ietf:wg:oauth:2.0:oob'
       +        }
       +        return MockResponse({
       +            'client_id': 'foo',
       +            'client_secret': 'bar',
       +        })
       +
       +    monkeypatch.setattr(requests, 'post', mock_post)
       +
       +    app = create_app('https://bigfish.software')
       +
       +    assert isinstance(app, App)
       +    assert app.client_id == 'foo'
       +    assert app.client_secret == 'bar'
       +
       +
       +def test_login(monkeypatch):
       +    app = App('https://bigfish.software', 'foo', 'bar')
       +
       +    def mock_post(url, data):
       +        assert url == 'https://bigfish.software/oauth/token'
       +        assert data == {
       +            'grant_type': 'password',
       +            'client_id': app.client_id,
       +            'client_secret': app.client_secret,
       +            'username': 'user',
       +            'password': 'pass',
       +            'scope': SCOPES,
       +        }
       +        return MockResponse({
       +            'access_token': 'xxx',
       +        })
       +
       +    monkeypatch.setattr(requests, 'post', mock_post)
       +
       +    user = login(app, 'user', 'pass')
       +
       +    assert isinstance(user, User)
       +    assert user.username == 'user'
       +    assert user.access_token == 'xxx'
 (DIR) diff --git a/tests/test_console.py b/tests/test_console.py
       @@ -0,0 +1,75 @@
       +import pytest
       +import requests
       +import sys
       +
       +from toot import User, App
       +from toot.console import cmd_post_status, ConsoleError
       +
       +from tests.utils import MockResponse
       +
       +app = App('https://habunek.com', 'foo', 'bar')
       +user = User('ivan@habunek.com', 'xxx')
       +
       +
       +def test_post_status_defaults(monkeypatch):
       +    def mock_prepare(request):
       +        assert request.method == 'POST'
       +        assert request.url == 'https://habunek.com/api/v1/statuses'
       +        assert request.data == {
       +            'status': '"Hello world"',
       +            'visibility': 'public',
       +            'media_ids[]': None,
       +        }
       +
       +    def mock_send(*args):
       +        return MockResponse({
       +            'url': 'http://ivan.habunek.com/'
       +        })
       +
       +    monkeypatch.setattr(requests.Request, 'prepare', mock_prepare)
       +    monkeypatch.setattr(requests.Session, 'send', mock_send)
       +
       +    sys.argv = ['toot', 'post', '"Hello world"']
       +    cmd_post_status(app, user)
       +
       +
       +def test_post_status_with_options(monkeypatch):
       +    def mock_prepare(request):
       +        assert request.method == 'POST'
       +        assert request.url == 'https://habunek.com/api/v1/statuses'
       +        assert request.data == {
       +            'status': '"Hello world"',
       +            'visibility': 'unlisted',
       +            'media_ids[]': None,
       +        }
       +
       +    def mock_send(*args):
       +        return MockResponse({
       +            'url': 'http://ivan.habunek.com/'
       +        })
       +
       +    monkeypatch.setattr(requests.Request, 'prepare', mock_prepare)
       +    monkeypatch.setattr(requests.Session, 'send', mock_send)
       +
       +    sys.argv = ['toot', 'post', '"Hello world"',
       +                '--visibility', 'unlisted']
       +
       +    cmd_post_status(app, user)
       +
       +
       +def test_post_status_invalid_visibility(monkeypatch):
       +    sys.argv = ['toot', 'post', '"Hello world"',
       +                '--visibility', 'foo']
       +
       +    with pytest.raises(ConsoleError) as ex:
       +        cmd_post_status(app, user)
       +    assert str(ex.value) == "Invalid visibility value given: 'foo'"
       +
       +
       +def test_post_status_invalid_media(monkeypatch):
       +    sys.argv = ['toot', 'post', '"Hello world"',
       +                '--media', 'does_not_exist.jpg']
       +
       +    with pytest.raises(ConsoleError) as ex:
       +        cmd_post_status(app, user)
       +    assert str(ex.value) == "File does not exist: does_not_exist.jpg"
 (DIR) diff --git a/tests/utils.py b/tests/utils.py
       @@ -0,0 +1,10 @@
       +
       +class MockResponse:
       +    def __init__(self, response_data={}):
       +        self.response_data = response_data
       +
       +    def raise_for_status(self):
       +        pass
       +
       +    def json(self):
       +        return self.response_data
 (DIR) diff --git a/toot/__init__.py b/toot/__init__.py
       @@ -9,6 +9,11 @@ User = namedtuple('User', ['username', 'access_token'])
        
        DEFAULT_INSTANCE = 'mastodon.social'
        
       +CLIENT_NAME = 'toot - Mastodon CLI Interface'
       +CLIENT_WEB = 'https://github.com/ihabunek/toot'
       +
       +SCOPES = 'read write follow'
       +
        logger = logging.getLogger('toot')
        
        
       @@ -59,7 +64,7 @@ def create_app(base_url):
            response = requests.post(url, {
                'client_name': 'toot - Mastodon CLI Interface',
                'redirect_uris': 'urn:ietf:wg:oauth:2.0:oob',
       -        'scopes': 'read write',
       +        'scopes': SCOPES,
                'website': 'https://github.com/ihabunek/toot',
            })
        
       @@ -81,7 +86,7 @@ def login(app, username, password):
                'client_secret': app.client_secret,
                'username': username,
                'password': password,
       -        'scope': 'read write',
       +        'scope': SCOPES,
            })
        
            response.raise_for_status()