improve tests by capturing stderr

This commit is contained in:
Alan Hamlett 2015-08-11 18:59:29 -07:00
parent 5d5b79d445
commit cc522f8b62
9 changed files with 126 additions and 14 deletions

View File

@ -1,4 +1,5 @@
coverage==3.7.1
mock==1.3.0
nose==1.3.7
nose-capturestderr==1.0
nose-exclude==0.3.0

0
tests/__init__.py Normal file
View File

View File

@ -0,0 +1,2 @@
[settings]
api_key

View File

@ -0,0 +1,47 @@
usage: nosetests [-h] --file file [--key KEY] [--write] [--plugin PLUGIN]
[--time time] [--lineno LINENO] [--cursorpos CURSORPOS]
[--notfile] [--proxy PROXY] [--project PROJECT]
[--alternate-project ALTERNATE_PROJECT] [--hostname HOSTNAME]
[--disableoffline] [--hidefilenames] [--exclude EXCLUDE]
[--include INCLUDE] [--logfile LOGFILE] [--apiurl API_URL]
[--config CONFIG] [--verbose] [--version]
Common interface for the WakaTime api.
optional arguments:
-h, --help show this help message and exit
--file file absolute path to file for current heartbeat
--key KEY your wakatime api key; uses api_key from
~/.wakatime.conf by default
--write when set, tells api this heartbeat was triggered from
writing to a file
--plugin PLUGIN optional text editor plugin name and version for User-
Agent header
--time time optional floating-point unix epoch timestamp; uses
current time by default
--lineno LINENO optional line number; current line being edited
--cursorpos CURSORPOS
optional cursor position in the current file
--notfile when set, will accept any value for the file. for
example, a domain name or other item you want to log
time towards.
--proxy PROXY optional https proxy url; for example:
https://user:pass@localhost:8080
--project PROJECT optional project name
--alternate-project ALTERNATE_PROJECT
optional alternate project name; auto-discovered
project takes priority
--hostname HOSTNAME hostname of current machine.
--disableoffline disables offline time logging instead of queuing
logged time
--hidefilenames obfuscate file names; will not send file names to api
--exclude EXCLUDE filename patterns to exclude from logging; POSIX regex
syntax; can be used more than once
--include INCLUDE filename patterns to log; when used in combination
with --exclude, files matching include will still be
logged; POSIX regex syntax; can be used more than once
--logfile LOGFILE defaults to ~/.wakatime.log
--apiurl API_URL heartbeats api url; for debugging with a local server
--config CONFIG defaults to ~/.wakatime.conf
--verbose turns on debug messages in log file
--version show program's version number and exit

View File

@ -0,0 +1,8 @@
usage: nosetests [-h] --file file [--key KEY] [--write] [--plugin PLUGIN]
[--time time] [--lineno LINENO] [--cursorpos CURSORPOS]
[--notfile] [--proxy PROXY] [--project PROJECT]
[--alternate-project ALTERNATE_PROJECT] [--hostname HOSTNAME]
[--disableoffline] [--hidefilenames] [--exclude EXCLUDE]
[--include INCLUDE] [--logfile LOGFILE] [--apiurl API_URL]
[--config CONFIG] [--verbose] [--version]
nosetests: error: Missing api key

View File

@ -0,0 +1,9 @@
Traceback (most recent call last):
File "/Users/alanhamlett/git/wakatime-cli/wakatime/base.py", line 73, in parseConfigFile
configs.readfp(fh)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ConfigParser.py", line 324, in readfp
self._read(fp, filename)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ConfigParser.py", line 546, in _read
raise e
ParsingError: File contains parsing errors: tests/samples/bad_config.cfg
[line 2]: u'api_key\n'

7
tests/samples/sample.cfg Normal file
View File

@ -0,0 +1,7 @@
[settings]
debug = true
api_key = 1234
api_url = https://api.wakatime.com/api/v1/heartbeats
ignore =
COMMIT_EDITMSG$
TAG_EDITMSG$

View File

@ -1,35 +1,29 @@
# -*- coding: utf-8 -*-
import logging
import sys
from wakatime.compat import u
from wakatime.packages.requests.models import Response
from . import utils
try:
from mock import patch
except ImportError:
from unittest.mock import patch
try:
# Python 2.6
import unittest2 as unittest
except ImportError:
# Python >= 2.7
import unittest
from wakatime.base import main
@patch('wakatime.packages.requests.adapters.HTTPAdapter.send')
class BaseTestCase(unittest.TestCase):
def setUp(self):
# disable logging while testing
logging.disable(logging.CRITICAL)
class BaseTestCase(utils.TestCase):
def test_help_contents(self, mock_requests):
args = ['', '--help']
with self.assertRaises(SystemExit):
retval = main(args)
self.assertEquals(retval, 0)
main(args)
expected_stdout = open('tests/samples/output/test_help_contents').read()
self.assertEquals(sys.stdout.getvalue(), expected_stdout)
self.assertEquals(sys.stderr.getvalue(), '')
def test_argument_parsing(self, mock_requests):
response = Response()
@ -38,3 +32,31 @@ class BaseTestCase(unittest.TestCase):
args = ['', '--file', 'tests/samples/emptyfile.txt', '--key', '123']
retval = main(args)
self.assertEquals(retval, 0)
self.assertEquals(sys.stdout.getvalue(), '')
self.assertEquals(sys.stderr.getvalue(), '')
def test_missing_config_file(self, mock_requests):
args = ['', '--file', 'tests/samples/emptyfile.txt', '--config', 'foo']
with self.assertRaises(SystemExit):
main(args)
expected_stdout = u("Error: Could not read from config file foo\n")
expected_stderr = open('tests/samples/output/test_missing_config_file').read()
self.assertEquals(sys.stdout.getvalue(), expected_stdout)
self.assertEquals(sys.stderr.getvalue(), expected_stderr)
def test_parse_config_file(self, mock_requests):
response = Response()
response.status_code = 201
mock_requests.return_value = response
args = ['', '--file', 'tests/samples/emptyfile.txt', '--config', 'tests/samples/sample.cfg']
retval = main(args)
self.assertEquals(retval, 0)
self.assertEquals(sys.stdout.getvalue(), '')
self.assertEquals(sys.stderr.getvalue(), '')
def test_parse_bad_config_file(self, mock_requests):
args = ['', '--file', 'tests/samples/emptyfile.txt', '--config', 'tests/samples/bad_config.cfg']
retval = main(args)
self.assertEquals(retval, 103)
self.assertTrue('ParsingError' in sys.stdout.getvalue())
self.assertEquals(sys.stderr.getvalue(), '')

16
tests/utils.py Normal file
View File

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
import logging
try:
# Python 2.6
import unittest2 as unittest
except ImportError:
# Python >= 2.7
import unittest
class TestCase(unittest.TestCase):
def setUp(self):
# disable logging while testing
logging.disable(logging.CRITICAL)