improve tests by capturing stderr
This commit is contained in:
parent
5d5b79d445
commit
cc522f8b62
9 changed files with 126 additions and 14 deletions
|
@ -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
0
tests/__init__.py
Normal file
2
tests/samples/bad_config.cfg
Normal file
2
tests/samples/bad_config.cfg
Normal file
|
@ -0,0 +1,2 @@
|
|||
[settings]
|
||||
api_key
|
47
tests/samples/output/test_help_contents
Normal file
47
tests/samples/output/test_help_contents
Normal 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
|
8
tests/samples/output/test_missing_config_file
Normal file
8
tests/samples/output/test_missing_config_file
Normal 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
|
9
tests/samples/output/test_parse_bad_config_file
Normal file
9
tests/samples/output/test_parse_bad_config_file
Normal 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
7
tests/samples/sample.cfg
Normal 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$
|
|
@ -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
16
tests/utils.py
Normal 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)
|
Loading…
Reference in a new issue