From 9884eea3115847c8ebad9c8e918e19f7ce754e67 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Tue, 8 Sep 2015 15:48:28 -0700 Subject: [PATCH] test bower dependencies --- tests/samples/codefiles/bower.json | 11 ++ tests/samples/{ => configs}/bad_config.cfg | 0 tests/samples/{ => configs}/debug_enabled.cfg | 0 tests/samples/{ => configs}/good_config.cfg | 0 tests/samples/{ => configs}/paranoid.cfg | 0 tests/samples/{ => configs}/project_map.cfg | 0 tests/samples/{ => configs}/sample.cfg | 0 tests/samples/{svn_output => output/svn} | 0 tests/test_dependencies.py | 118 ++++++++++++++++++ tests/test_languages.py | 63 +--------- tests/test_logging.py | 4 +- tests/test_main.py | 28 +++-- tests/test_offlinequeue.py | 8 +- tests/test_project.py | 16 +-- wakatime/main.py | 3 +- 15 files changed, 166 insertions(+), 85 deletions(-) create mode 100644 tests/samples/codefiles/bower.json rename tests/samples/{ => configs}/bad_config.cfg (100%) rename tests/samples/{ => configs}/debug_enabled.cfg (100%) rename tests/samples/{ => configs}/good_config.cfg (100%) rename tests/samples/{ => configs}/paranoid.cfg (100%) rename tests/samples/{ => configs}/project_map.cfg (100%) rename tests/samples/{ => configs}/sample.cfg (100%) rename tests/samples/{svn_output => output/svn} (100%) create mode 100644 tests/test_dependencies.py diff --git a/tests/samples/codefiles/bower.json b/tests/samples/codefiles/bower.json new file mode 100644 index 0000000..a409c7d --- /dev/null +++ b/tests/samples/codefiles/bower.json @@ -0,0 +1,11 @@ +{ + "name": "wakatime", + "version": "1.0.0", + "dependencies": { + "animate.css": "latest", + "bootstrap": "latest", + "bootstrap-daterangepicker": "latest", + "moment": "latest", + "moment-timezone": "latest", + } +} diff --git a/tests/samples/bad_config.cfg b/tests/samples/configs/bad_config.cfg similarity index 100% rename from tests/samples/bad_config.cfg rename to tests/samples/configs/bad_config.cfg diff --git a/tests/samples/debug_enabled.cfg b/tests/samples/configs/debug_enabled.cfg similarity index 100% rename from tests/samples/debug_enabled.cfg rename to tests/samples/configs/debug_enabled.cfg diff --git a/tests/samples/good_config.cfg b/tests/samples/configs/good_config.cfg similarity index 100% rename from tests/samples/good_config.cfg rename to tests/samples/configs/good_config.cfg diff --git a/tests/samples/paranoid.cfg b/tests/samples/configs/paranoid.cfg similarity index 100% rename from tests/samples/paranoid.cfg rename to tests/samples/configs/paranoid.cfg diff --git a/tests/samples/project_map.cfg b/tests/samples/configs/project_map.cfg similarity index 100% rename from tests/samples/project_map.cfg rename to tests/samples/configs/project_map.cfg diff --git a/tests/samples/sample.cfg b/tests/samples/configs/sample.cfg similarity index 100% rename from tests/samples/sample.cfg rename to tests/samples/configs/sample.cfg diff --git a/tests/samples/svn_output b/tests/samples/output/svn similarity index 100% rename from tests/samples/svn_output rename to tests/samples/output/svn diff --git a/tests/test_dependencies.py b/tests/test_dependencies.py new file mode 100644 index 0000000..e67e6cb --- /dev/null +++ b/tests/test_dependencies.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- + + +from wakatime.main import execute +from wakatime.packages import requests + +import os +import time +import sys +from wakatime.compat import u +from wakatime.packages.requests.models import Response +from . import utils + +try: + from .packages import simplejson as json +except (ImportError, SyntaxError): + import json +try: + from mock import ANY +except ImportError: + from unittest.mock import ANY + + +class LanguagesTestCase(utils.TestCase): + patch_these = [ + 'wakatime.packages.requests.adapters.HTTPAdapter.send', + 'wakatime.offlinequeue.Queue.push', + ['wakatime.offlinequeue.Queue.pop', None], + 'wakatime.session_cache.SessionCache.save', + 'wakatime.session_cache.SessionCache.delete', + ['wakatime.session_cache.SessionCache.get', requests.session], + ] + + def python_dependencies_detected(self): + response = Response() + response.status_code = 0 + self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response + + now = u(int(time.time())) + entity = 'tests/samples/codefiles/python.py' + config = 'tests/samples/configs/good_config.cfg' + + args = ['--file', entity, '--config', config, '--time', now] + + retval = execute(args) + self.assertEquals(retval, 102) + self.assertEquals(sys.stdout.getvalue(), '') + self.assertEquals(sys.stderr.getvalue(), '') + + self.patched['wakatime.session_cache.SessionCache.get'].assert_called_once_with() + self.patched['wakatime.session_cache.SessionCache.delete'].assert_called_once_with() + self.patched['wakatime.session_cache.SessionCache.save'].assert_not_called() + + heartbeat = { + 'language': u('Python'), + 'lines': 27, + 'entity': os.path.realpath(entity), + 'project': u(os.path.basename(os.path.realpath('.'))), + 'dependencies': ANY, + 'branch': os.environ.get('TRAVIS_COMMIT', ANY), + 'time': float(now), + 'type': 'file', + } + stats = { + u('cursorpos'): None, + u('dependencies'): ANY, + u('language'): u('Python'), + u('lineno'): None, + u('lines'): 27, + } + expected_dependencies = ['wakatime', 'mock', 'django', 'simplejson', 'os'] + + self.patched['wakatime.offlinequeue.Queue.push'].assert_called_once_with(heartbeat, ANY, None) + for dep in expected_dependencies: + self.assertIn(dep, self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0]['dependencies']) + self.assertEquals(stats, json.loads(self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][1])) + self.patched['wakatime.offlinequeue.Queue.pop'].assert_not_called() + + def test_bower_dependencies_detected(self): + response = Response() + response.status_code = 0 + self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response + + now = u(int(time.time())) + entity = 'tests/samples/codefiles/bower.json' + config = 'tests/samples/configs/good_config.cfg' + + args = ['--file', entity, '--config', config, '--time', now] + + retval = execute(args) + self.assertEquals(sys.stdout.getvalue(), '') + self.assertEquals(sys.stderr.getvalue(), '') + self.assertEquals(retval, 102) + + heartbeat = { + 'language': u('JSON'), + 'lines': 11, + 'entity': os.path.realpath(entity), + 'project': u(os.path.basename(os.path.realpath('.'))), + 'dependencies': ANY, + 'branch': os.environ.get('TRAVIS_COMMIT', ANY), + 'time': float(now), + 'type': 'file', + } + stats = { + u('cursorpos'): None, + u('dependencies'): ANY, + u('language'): u('JSON'), + u('lineno'): None, + u('lines'): 11, + } + expected_dependencies = ['animate.css', 'moment', 'moment-timezone'] + + self.patched['wakatime.offlinequeue.Queue.push'].assert_called_once_with(heartbeat, ANY, None) + for dep in expected_dependencies: + self.assertIn(dep, self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0]['dependencies']) + self.assertEquals(stats, json.loads(self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][1])) + self.patched['wakatime.offlinequeue.Queue.pop'].assert_not_called() diff --git a/tests/test_languages.py b/tests/test_languages.py index 2d8b5fb..211bd7c 100644 --- a/tests/test_languages.py +++ b/tests/test_languages.py @@ -4,22 +4,11 @@ from wakatime.main import execute from wakatime.packages import requests -import os import time -import sys from wakatime.compat import u from wakatime.packages.requests.models import Response from . import utils -try: - from .packages import simplejson as json -except (ImportError, SyntaxError): - import json -try: - from mock import ANY -except ImportError: - from unittest.mock import ANY - class LanguagesTestCase(utils.TestCase): patch_these = [ @@ -31,59 +20,13 @@ class LanguagesTestCase(utils.TestCase): ['wakatime.session_cache.SessionCache.get', requests.session], ] - def test_python_dependencies_detected(self): - response = Response() - response.status_code = 0 - self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response - - now = u(int(time.time())) - entity = 'tests/samples/codefiles/python.py' - config = 'tests/samples/sample.cfg' - - args = ['--file', entity, '--config', config, '--time', now] - - retval = execute(args) - self.assertEquals(retval, 102) - self.assertEquals(sys.stdout.getvalue(), '') - self.assertEquals(sys.stderr.getvalue(), '') - - self.patched['wakatime.session_cache.SessionCache.get'].assert_called_once_with() - self.patched['wakatime.session_cache.SessionCache.delete'].assert_called_once_with() - self.patched['wakatime.session_cache.SessionCache.save'].assert_not_called() - - heartbeat = { - 'language': u('Python'), - 'lines': 27, - 'entity': os.path.realpath(entity), - 'project': u(os.path.basename(os.path.realpath('.'))), - 'dependencies': ANY, - 'branch': os.environ.get('TRAVIS_COMMIT', ANY), - 'time': float(now), - 'type': 'file', - } - stats = { - u('cursorpos'): None, - u('dependencies'): ANY, - u('language'): u('Python'), - u('lineno'): None, - u('lines'): 27, - } - expected_dependencies = ['wakatime', 'mock', 'django', 'simplejson', 'os'] - expected_dependencies = ['wakatime', 'mock', 'django', 'simplejson', 'os'] - - self.patched['wakatime.offlinequeue.Queue.push'].assert_called_once_with(heartbeat, ANY, None) - for dep in expected_dependencies: - self.assertIn(dep, self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0]['dependencies']) - self.assertEquals(stats, json.loads(self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][1])) - self.patched['wakatime.offlinequeue.Queue.pop'].assert_not_called() - def test_language_detected_for_header_file(self): response = Response() response.status_code = 500 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response now = u(int(time.time())) - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' entity = 'tests/samples/codefiles/see.h' args = ['--file', entity, '--config', config, '--time', now] @@ -108,7 +51,7 @@ class LanguagesTestCase(utils.TestCase): self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response now = u(int(time.time())) - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' entity = 'tests/samples/codefiles/c_only/see.h' args = ['--file', entity, '--config', config, '--time', now] @@ -124,7 +67,7 @@ class LanguagesTestCase(utils.TestCase): self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response now = u(int(time.time())) - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' entity = 'tests/samples/codefiles/c_and_cpp/empty.h' args = ['--file', entity, '--config', config, '--time', now] diff --git a/tests/test_logging.py b/tests/test_logging.py index 7564c72..9529c37 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -35,7 +35,7 @@ class LanguagesTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/python.py' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] retval = execute(args) @@ -60,7 +60,7 @@ class LanguagesTestCase(utils.TestCase): with tempfile.NamedTemporaryFile() as fh: now = u(int(time.time())) entity = 'tests/samples/codefiles/python.py' - config = 'tests/samples/good_config.cfg' + config = 'tests/samples/configs/good_config.cfg' logfile = os.path.realpath(fh.name) args = ['--file', entity, '--config', config, '--time', now, '--logfile', logfile] diff --git a/tests/test_main.py b/tests/test_main.py index 49128a5..a626ede 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -47,7 +47,9 @@ class BaseTestCase(utils.TestCase): response.status_code = 201 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response - args = ['--file', 'tests/samples/codefiles/twolinefile.txt', '--key', '123', '--config', 'tests/samples/sample.cfg'] + entity = 'tests/samples/codefiles/twolinefile.txt' + config = 'tests/samples/configs/sample.cfg' + args = ['--file', entity, '--key', '123', '--config', config] retval = execute(args) self.assertEquals(retval, 0) @@ -62,7 +64,9 @@ class BaseTestCase(utils.TestCase): self.patched['wakatime.offlinequeue.Queue.pop'].assert_called_once_with() def test_missing_config_file(self): - args = ['--file', 'tests/samples/codefiles/emptyfile.txt', '--config', 'foo'] + config = 'foo' + entity = 'tests/samples/codefiles/emptyfile.txt' + args = ['--file', entity, '--config', config] with self.assertRaises(SystemExit): execute(args) expected_stdout = u("Error: Could not read from config file foo\n") @@ -77,7 +81,9 @@ class BaseTestCase(utils.TestCase): response.status_code = 201 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response - args = ['--file', 'tests/samples/codefiles/emptyfile.txt', '--config', 'tests/samples/sample.cfg'] + entity = 'tests/samples/codefiles/emptyfile.txt' + config = 'tests/samples/configs/sample.cfg' + args = ['--file', entity, '--config', config] retval = execute(args) self.assertEquals(retval, 0) self.assertEquals(sys.stdout.getvalue(), '') @@ -91,7 +97,9 @@ class BaseTestCase(utils.TestCase): self.patched['wakatime.offlinequeue.Queue.pop'].assert_called_once_with() def test_bad_config_file(self): - args = ['--file', 'tests/samples/codefiles/emptyfile.txt', '--config', 'tests/samples/bad_config.cfg'] + entity = 'tests/samples/codefiles/emptyfile.txt' + config = 'tests/samples/configs/bad_config.cfg' + args = ['--file', entity, '--config', config] retval = execute(args) self.assertEquals(retval, 103) self.assertIn('ParsingError', sys.stdout.getvalue()) @@ -108,7 +116,7 @@ class BaseTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--key', '123', '--config', config, '--time', now] @@ -149,7 +157,7 @@ class BaseTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' - config = 'tests/samples/paranoid.cfg' + config = 'tests/samples/configs/paranoid.cfg' args = ['--file', entity, '--key', '123', '--config', config, '--time', now] @@ -191,7 +199,7 @@ class BaseTestCase(utils.TestCase): now = u(int(time.time())) args = ['--file', 'tests/samples/codefiles/twolinefile.txt', '--key', '123', - '--config', 'tests/samples/paranoid.cfg', '--time', now] + '--config', 'tests/samples/configs/paranoid.cfg', '--time', now] retval = execute(args) @@ -232,7 +240,7 @@ class BaseTestCase(utils.TestCase): now = u(int(time.time())) args = ['--file', 'tests/samples/codefiles/twolinefile.txt', '--key', '123', - '--config', 'tests/samples/paranoid.cfg', '--time', now] + '--config', 'tests/samples/configs/paranoid.cfg', '--time', now] retval = execute(args) @@ -254,7 +262,7 @@ class BaseTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--alternate-project', 'xyz', '--config', config, '--time', now] @@ -295,7 +303,7 @@ class BaseTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--project', 'xyz', '--config', config, '--time', now] diff --git a/tests/test_offlinequeue.py b/tests/test_offlinequeue.py index 9bb3bac..4c2f90a 100644 --- a/tests/test_offlinequeue.py +++ b/tests/test_offlinequeue.py @@ -28,7 +28,7 @@ class OfflineQueueTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) @@ -44,7 +44,7 @@ class OfflineQueueTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) @@ -60,7 +60,7 @@ class OfflineQueueTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) @@ -81,7 +81,7 @@ class OfflineQueueTestCase(utils.TestCase): now = u(int(time.time())) entity = fh.name - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) diff --git a/tests/test_project.py b/tests/test_project.py index bfe6190..82d86e1 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -30,7 +30,7 @@ class LanguagesTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/projects/git/emptyfile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--project', 'forced-project', '--file', entity, '--config', config, '--time', now] @@ -45,7 +45,7 @@ class LanguagesTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/projects/wakatime_project_file/emptyfile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] @@ -64,7 +64,7 @@ class LanguagesTestCase(utils.TestCase): now = u(int(time.time())) entity = os.path.join(tempdir, 'git', 'emptyfile.txt') - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] @@ -81,13 +81,13 @@ class LanguagesTestCase(utils.TestCase): mock_git.return_value = False with utils.mock.patch('wakatime.projects.subversion.Popen.communicate') as mock_popen: - stdout = open('tests/samples/svn_output').read() + stdout = open('tests/samples/output/svn').read() stderr = '' mock_popen.return_value = (stdout, stderr) now = u(int(time.time())) entity = 'tests/samples/projects/svn/emptyfile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] @@ -111,7 +111,7 @@ class LanguagesTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/projects/svn/emptyfile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] @@ -129,7 +129,7 @@ class LanguagesTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/projects/hg/emptyfile.txt' - config = 'tests/samples/sample.cfg' + config = 'tests/samples/configs/sample.cfg' args = ['--file', entity, '--config', config, '--time', now] @@ -147,7 +147,7 @@ class LanguagesTestCase(utils.TestCase): now = u(int(time.time())) entity = 'tests/samples/projects/project_map/emptyfile.txt' - fh.write(open('tests/samples/project_map.cfg').read().encode('utf-8')) + fh.write(open('tests/samples/configs/project_map.cfg').read().encode('utf-8')) fh.write('{0} = proj-map'.format(os.path.realpath(os.path.dirname(os.path.dirname(entity)))).encode('utf-8')) fh.flush() diff --git a/wakatime/main.py b/wakatime/main.py index 2af2fcb..1319c01 100644 --- a/wakatime/main.py +++ b/wakatime/main.py @@ -426,7 +426,8 @@ def execute(argv=None): kwargs['stats'] = stats kwargs['hostname'] = args.hostname or socket.gethostname() - if send_heartbeat(**kwargs): + rv = send_heartbeat(**kwargs) + if rv: queue = Queue() while True: heartbeat = queue.pop()