def test_hostname_set_from_config_file(self): response = Response() response.status_code = 201 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'emptyfile.txt')) hostname = 'fromcfgfile' config = 'tests/samples/configs/has_everything.cfg' args = [ '--file', entity, '--config', config, '--timeout', '15', '--logfile', '~/.wakatime.log' ] retval = execute(args) self.assertEquals(retval, SUCCESS) self.assertNothingPrinted() headers = { 'X-Machine-Name': hostname.encode('utf-8') if is_py3 else hostname, } self.assertHeartbeatSent(headers=headers, proxies=ANY, timeout=15) self.assertHeartbeatNotSavedOffline() self.assertOfflineHeartbeatsSynced() self.assertSessionCacheSaved()
def test_log_file_location_can_be_changed(self, logs): logging.disable(logging.NOTSET) response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with tempfile.NamedTemporaryFile() as fh: now = u(int(time.time())) entity = 'tests/samples/codefiles/python.py' config = 'tests/samples/configs/good_config.cfg' logfile = os.path.realpath(fh.name) args = [ '--file', entity, '--config', config, '--time', now, '--logfile', logfile ] execute(args) retval = execute(args) self.assertEquals(retval, 102) self.assertEquals(sys.stdout.getvalue(), '') self.assertEquals(sys.stderr.getvalue(), '') self.assertEquals(logging.WARNING, logging.getLogger('WakaTime').level) self.assertEquals( logfile, logging.getLogger('WakaTime').handlers[0].baseFilename) logs.check()
def test_nonascii_hostname(self): response = Response() response.status_code = 201 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'emptyfile.txt')) hostname = 'test汉语' if is_py3 else 'test\xe6\xb1\x89\xe8\xaf\xad' with utils.mock.patch('socket.gethostname') as mock_gethostname: mock_gethostname.return_value = hostname self.assertEquals(type(hostname).__name__, 'str') config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config] retval = execute(args) self.assertEquals(retval, SUCCESS) 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_not_called() self.patched['wakatime.session_cache.SessionCache.save'].assert_called_once_with(ANY) self.patched['wakatime.offlinequeue.Queue.push'].assert_not_called() self.patched['wakatime.offlinequeue.Queue.pop'].assert_called_once_with() headers = self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].call_args[0][0].headers self.assertEquals(headers.get('X-Machine-Name'), hostname.encode('utf-8') if is_py3 else hostname)
def test_verbose_flag_enables_verbose_logging(self, logs): logging.disable(logging.NOTSET) 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/has_regex_errors.cfg' args = ['--file', entity, '--config', config, '--time', now, '--verbose'] retval = execute(args) self.assertEquals(retval, 102) self.assertEquals(sys.stdout.getvalue(), '') self.assertEquals(sys.stderr.getvalue(), '') self.assertEquals(logging.DEBUG, logging.getLogger('WakaTime').level) logfile = os.path.realpath(os.path.expanduser('~/.wakatime.log')) self.assertEquals(logfile, logging.getLogger('WakaTime').handlers[0].baseFilename) output = [u(' ').join(x) for x in logs.actual()] expected = u('WakaTime WARNING Regex error (unbalanced parenthesis) for include pattern: \\(invalid regex)') if self.isPy35: expected = u('WakaTime WARNING Regex error (unbalanced parenthesis at position 15) for include pattern: \\(invalid regex)') self.assertEquals(output[0], expected) expected = u('WakaTime WARNING Regex error (unbalanced parenthesis) for exclude pattern: \\(invalid regex)') if self.isPy35: expected = u('WakaTime WARNING Regex error (unbalanced parenthesis at position 15) for exclude pattern: \\(invalid regex)') self.assertEquals(output[1], expected) self.assertEquals(output[2], u('WakaTime DEBUG Sending heartbeat to api at https://api.wakatime.com/api/v1/heartbeats')) self.assertIn('Python', output[3]) self.assertIn('response_code', output[4])
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/configs/good_config.cfg' entity = 'tests/samples/codefiles/see.h' args = ['--file', entity, '--config', config, '--time', now] retval = execute(args) self.assertEquals(retval, 102) language = u('C') self.assertEqual( self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0].get('language'), language) entity = 'tests/samples/codefiles/seeplusplus.h' args[1] = entity retval = execute(args) self.assertEquals(retval, 102) language = u('C++') self.assertEqual( self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0].get('language'), language)
def test_config_file_not_passed_in_command_line_args(self): response = Response() response.status_code = 201 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'emptyfile.txt')) args = ['--file', entity, '--logfile', '~/.wakatime.log'] with utils.mock.patch( 'wakatime.configs.os.environ.get') as mock_env: mock_env.return_value = None with utils.mock.patch('wakatime.configs.open') as mock_open: mock_open.side_effect = IOError('') with self.assertRaises(SystemExit) as e: execute(args) self.assertEquals(int(str(e.exception)), AUTH_ERROR) expected_stdout = u('') expected_stderr = open( 'tests/samples/output/configs_test_config_file_not_passed_in_command_line_args' ).read() self.assertEquals(sys.stdout.getvalue(), expected_stdout) self.assertEquals(sys.stderr.getvalue(), expected_stderr) self.patched[ 'wakatime.session_cache.SessionCache.get'].assert_not_called()
def test_svn_exception_handled(self): response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.mock.patch('wakatime.projects.git.Git.process') as mock_git: mock_git.return_value = False with utils.mock.patch( 'wakatime.projects.subversion.Popen') as mock_popen: mock_popen.side_effect = OSError('') with utils.mock.patch( 'wakatime.projects.subversion.Popen.communicate' ) as mock_communicate: mock_communicate.side_effect = OSError('') now = u(int(time.time())) entity = 'tests/samples/projects/svn/afolder/emptyfile.txt' config = 'tests/samples/configs/good_config.cfg' args = [ '--file', entity, '--config', config, '--time', now ] execute(args) self.assertNotIn( 'project', self.patched['wakatime.offlinequeue.Queue.push']. call_args[0][0])
def test_project_map_with_invalid_regex(self, logs): logging.disable(logging.NOTSET) 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/projects/project_map42/emptyfile.txt' config = 'tests/samples/configs/project_map_invalid.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) self.assertEquals(sys.stdout.getvalue(), '') self.assertEquals(sys.stderr.getvalue(), '') output = [u(' ').join(x) for x in logs.actual()] expected = u( 'WakaTime WARNING Regex error (unexpected end of regular expression) for projectmap pattern: invalid[({regex' ) if self.isPy35: expected = u( 'WakaTime WARNING Regex error (unterminated character set at position 7) for projectmap pattern: invalid[({regex' ) self.assertEquals(output[0], expected)
def test_project_map_with_replacement_group_index_error(self, logs): logging.disable(logging.NOTSET) 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/projects/project_map42/emptyfile.txt' config = 'tests/samples/configs/project_map_malformed.cfg' args = ['--file', entity, '--config', config, '--time', now] retval = execute(args) self.assertEquals(retval, API_ERROR) self.assertEquals(sys.stdout.getvalue(), '') self.assertEquals(sys.stderr.getvalue(), '') log_output = "\n".join([u(' ').join(x) for x in logs.actual()]) expected = u( 'WakaTime WARNING Regex error (tuple index out of range) for projectmap pattern: proj-map{3}' ) self.assertEquals(log_output, expected)
def test_svn_on_mac_without_xcode_tools_installed(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/projects/svn/afolder/emptyfile.txt' config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] with utils.mock.patch('wakatime.projects.git.Git.process') as mock_git: mock_git.return_value = False with utils.mock.patch( 'wakatime.projects.subversion.platform.system' ) as mock_system: mock_system.return_value = 'Darwin' with utils.mock.patch( 'wakatime.projects.subversion.Popen.communicate' ) as mock_popen: stdout = open('tests/samples/output/svn').read() stderr = '' mock_popen.return_value = utils.DynamicIterable( (stdout, stderr), raise_on_calls=[OSError('')]) execute(args) self.assertNotIn( 'project', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0])
def test_ioerror_when_reading_mercurial_branch(self): response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.mock.patch('wakatime.projects.git.Git.process') as mock_git: mock_git.return_value = False now = u(int(time.time())) entity = 'tests/samples/projects/hg/emptyfile.txt' config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] with utils.mock.patch( 'wakatime.projects.mercurial.open') as mock_open: mock_open.side_effect = IOError('') execute(args) self.assertEquals( 'hg', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0]['project']) self.assertEquals( 'default', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0]['branch'])
def test_git_detached_head_not_used_as_branch(self): response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response tempdir = tempfile.mkdtemp() shutil.copytree('tests/samples/projects/git-with-detached-head', os.path.join(tempdir, 'git')) shutil.move(os.path.join(tempdir, 'git', 'dot_git'), os.path.join(tempdir, 'git', '.git')) now = u(int(time.time())) entity = os.path.join(tempdir, 'git', 'emptyfile.txt') config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) self.assertEquals( 'git', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0] ['project']) self.assertNotIn( 'branch', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0])
def test_ioerror_when_reading_git_branch(self): response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response tempdir = tempfile.mkdtemp() shutil.copytree('tests/samples/projects/git', os.path.join(tempdir, 'git')) shutil.move(os.path.join(tempdir, 'git', 'dot_git'), os.path.join(tempdir, 'git', '.git')) now = u(int(time.time())) entity = os.path.join(tempdir, 'git', 'emptyfile.txt') config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] with utils.mock.patch('wakatime.projects.git.open') as mock_open: mock_open.side_effect = IOError('') execute(args) self.assertEquals( 'git', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0] ['project']) self.assertEquals( 'master', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0].get('branch'))
def test_no_ssl_verify_from_config_file(self): response = Response() response.status_code = 201 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'emptyfile.txt')) config = 'tests/samples/configs/has_ssl_verify_disabled.cfg' args = [ '--file', entity, '--config', config, '--timeout', '15', '--logfile', '~/.wakatime.log' ] retval = execute(args) self.assertEquals(retval, SUCCESS) self.assertNothingPrinted() self.assertHeartbeatSent(proxies=ANY, timeout=15, verify=False) self.assertHeartbeatNotSavedOffline() self.assertOfflineHeartbeatsSynced() self.assertSessionCacheSaved()
def test_php_dependencies_detected(self): response = Response() response.status_code = 0 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/php.php' shutil.copy(entity, os.path.join(tempdir, 'php.php')) entity = os.path.realpath(os.path.join(tempdir, 'php.php')) now = u(int(time.time())) 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('PHP'), 'lines': ANY, 'entity': os.path.realpath(entity), 'dependencies': ANY, 'project': u(os.path.basename(os.path.realpath('.'))), 'time': float(now), 'type': 'file', } stats = { u('cursorpos'): None, u('dependencies'): ANY, u('language'): u('PHP'), u('lineno'): None, u('lines'): ANY, } expected_dependencies = [ 'Interop', 'FooBarOne', 'FooBarTwo', 'FooBarThree', 'FooBarFour', 'FooBarSeven', 'FooBarEight', 'ArrayObject', "'ServiceLocator.php'", "'ServiceLocatorTwo.php'", ] self.patched['wakatime.offlinequeue.Queue.push'].assert_called_once_with(ANY, ANY, None) for key, val in self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0].items(): self.assertEquals(heartbeat[key], val) self.assertEquals(stats, json.loads(self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][1])) dependencies = self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0]['dependencies'] self.assertListsEqual(dependencies, expected_dependencies) self.patched['wakatime.offlinequeue.Queue.pop'].assert_not_called()
def test_alternate_project_argument_used_when_project_not_detected(self): response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response tempdir = tempfile.mkdtemp() entity = 'tests/samples/projects/git/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) now = u(int(time.time())) entity = os.path.join(tempdir, 'emptyfile.txt') config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) args = [ '--file', entity, '--config', config, '--time', now, '--alternate-project', 'alt-project' ] execute(args) calls = self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].call_args_list body = calls[0][0][0].body data = json.loads(body)[0] self.assertEquals(None, data.get('project')) body = calls[1][0][0].body data = json.loads(body)[0] self.assertEquals('alt-project', data['project'])
def test_go_dependencies_detected(self): response = Response() response.status_code = 0 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/go.go' shutil.copy(entity, os.path.join(tempdir, 'go.go')) entity = os.path.realpath(os.path.join(tempdir, 'go.go')) now = u(int(time.time())) 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('Go'), 'lines': 24, 'entity': os.path.realpath(entity), 'project': u(os.path.basename(os.path.realpath('.'))), 'dependencies': ANY, 'time': float(now), 'type': 'file', } stats = { u('cursorpos'): None, u('dependencies'): ANY, u('language'): u('Go'), u('lineno'): None, u('lines'): 24, } expected_dependencies = [ '"compress/gzip"', '"direct"', '"foobar"', '"github.com/golang/example/stringutil"', '"image/gif"', '"log"', '"math"', '"oldname"', '"os"', '"supress"', ] self.patched['wakatime.offlinequeue.Queue.push'].assert_called_once_with(ANY, ANY, None) for key, val in self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0].items(): self.assertEquals(heartbeat[key], val) dependencies = self.patched['wakatime.offlinequeue.Queue.push'].call_args[0][0]['dependencies'] self.assertListsEqual(dependencies, expected_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_ioerror_when_reading_mercurial_branch(self, logs): logging.disable(logging.NOTSET) response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with mock.patch('wakatime.projects.git.Git.process') as mock_git: mock_git.return_value = False now = u(int(time.time())) entity = 'tests/samples/projects/hg/emptyfile.txt' config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] with mock.patch('wakatime.projects.mercurial.open') as mock_open: mock_open.side_effect = IOError('') execute(args) self.assertEquals( 'hg', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0]['project']) self.assertEquals( 'default', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0]['branch']) self.assertNothingPrinted() actual = self.getLogOutput(logs) expected = 'OSError' if self.isPy33OrNewer else 'IOError' self.assertIn(expected, actual)
def test_svn_project_detected(self): response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.mock.patch('wakatime.projects.git.Git.process') as mock_git: mock_git.return_value = False with utils.mock.patch( 'wakatime.projects.subversion.Popen.communicate' ) as mock_popen: stdout = open('tests/samples/output/svn').read() stderr = '' mock_popen.return_value = (stdout, stderr) now = u(int(time.time())) entity = 'tests/samples/projects/svn/afolder/emptyfile.txt' config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) self.assertEquals( 'svn', self.patched['wakatime.offlinequeue.Queue.push']. call_args[0][0]['project'])
def test_exclude_unknown_project_when_project_detected(self, logs): logging.disable(logging.NOTSET) response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'emptyfile.txt')) config = 'tests/samples/configs/exclude_unknown_project.cfg' args = [ '--file', entity, '--project', 'proj-arg', '--config', config, '--log-file', '~/.wakatime.log' ] execute(args) self.assertNothingPrinted() self.assertNothingLogged(logs) self.assertEquals( 'proj-arg', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0]['project'])
def test_mercurial_project_detected(self): response = Response() response.status_code = 0 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.mock.patch('wakatime.projects.git.Git.process') as mock_git: mock_git.return_value = False now = u(int(time.time())) entity = 'tests/samples/projects/hg/emptyfile.txt' config = 'tests/samples/configs/good_config.cfg' args = ['--file', entity, '--config', config, '--time', now] execute(args) self.assertEquals( 'hg', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0]['project']) self.assertEquals( 'test-hg-branch', self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0]['branch'])
def test_default_log_file_used(self, logs): logging.disable(logging.NOTSET) 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/has_regex_errors.cfg' args = ['--file', entity, '--config', config, '--time', now] retval = execute(args) self.assertEquals(retval, 102) self.assertNothingPrinted() self.assertEquals(logging.WARNING, logging.getLogger('WakaTime').level) logfile = os.path.realpath(os.path.expanduser('~/.wakatime.log')) self.assertEquals(logfile, logging.getLogger('WakaTime').handlers[0].baseFilename) output = [u(' ').join(x) for x in logs.actual()] expected = u('WakaTime WARNING Regex error (unbalanced parenthesis) for include pattern: \\(invalid regex)') if self.isPy35OrNewer: expected = u('WakaTime WARNING Regex error (unbalanced parenthesis at position 15) for include pattern: \\(invalid regex)') self.assertEquals(output[0], expected) expected = u('WakaTime WARNING Regex error (unbalanced parenthesis) for exclude pattern: \\(invalid regex)') if self.isPy35OrNewer: expected = u('WakaTime WARNING Regex error (unbalanced parenthesis at position 15) for exclude pattern: \\(invalid regex)') self.assertEquals(output[1], expected)
def test_vim_alternate_language_is_used_when_not_guessed(self): response = Response() response.status_code = 500 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.mock.patch( 'wakatime.stats.smart_guess_lexer') as mock_guess_lexer: mock_guess_lexer.return_value = None now = u(int(time.time())) config = 'tests/samples/configs/good_config.cfg' entity = 'tests/samples/codefiles/python.py' args = [ '--file', entity, '--config', config, '--time', now, '--alternate-language', 'java', '--plugin', 'NeoVim/703 vim-wakatime/4.0.9' ] retval = execute(args) self.assertEquals(retval, 102) language = u('Java') self.assertEqual( self.patched['wakatime.offlinequeue.Queue.push'].call_args[0] [0].get('language'), language)
def test_log_file_location_can_be_set_from_env_variable(self, logs): logging.disable(logging.NOTSET) response = Response() response.status_code = 0 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response now = u(int(time.time())) with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/python.py' shutil.copy(entity, os.path.join(tempdir, 'python.py')) entity = os.path.realpath(os.path.join(tempdir, 'python.py')) config = 'tests/samples/configs/good_config.cfg' shutil.copy(config, os.path.join(tempdir, '.wakatime.cfg')) config = os.path.realpath(os.path.join(tempdir, '.wakatime.cfg')) expected_logfile = os.path.realpath(os.path.join(tempdir, '.wakatime.log')) with utils.mock.patch('wakatime.main.os.environ.get') as mock_env: mock_env.return_value = tempdir args = ['--file', entity, '--config', config, '--time', now] execute(args) retval = execute(args) self.assertEquals(retval, 102) self.assertNothingPrinted() self.assertEquals(logging.WARNING, logging.getLogger('WakaTime').level) logfile = os.path.realpath(logging.getLogger('WakaTime').handlers[0].baseFilename) self.assertEquals(logfile, expected_logfile) logs.check()
def test_exception_traceback(self, logs): logging.disable(logging.NOTSET) 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] with utils.mock.patch('wakatime.stats.open') as mock_open: mock_open.side_effect = Exception('FooBar') retval = execute(args) self.assertEquals(retval, 102) self.assertEquals(sys.stdout.getvalue(), '') self.assertEquals(sys.stderr.getvalue(), '') output = u("\n").join([u(' ').join(x) for x in logs.actual()]) self.assertIn( u('WakaTime ERROR Traceback (most recent call last):'), output) self.assertIn(u('Exception: FooBar'), output)
def test_exclude_file_because_project_unknown(self, logs): logging.disable(logging.NOTSET) response = Response() response.status_code = 0 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'emptyfile.txt')) config = 'tests/samples/configs/exclude_unknown_project.cfg' args = ['--file', entity, '--config', config, '--verbose', '--log-file', '~/.wakatime.log'] retval = execute(args) self.assertEquals(retval, SUCCESS) self.assertNothingPrinted() actual = self.getLogOutput(logs) expected = 'WakaTime DEBUG Skipping because project unknown.' self.assertEquals(actual, expected) self.assertHeartbeatNotSent() self.assertHeartbeatNotSavedOffline() self.assertOfflineHeartbeatsSynced() self.assertSessionCacheUntouched()
def test_invalid_api_key(self, logs): logging.disable(logging.NOTSET) response = Response() response.status_code = 201 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response config = 'tests/samples/configs/missing_api_key.cfg' args = ['--config', config, '--key', 'invalid-api-key'] with self.assertRaises(SystemExit) as e: execute(args) self.assertEquals(int(str(e.exception)), AUTH_ERROR) self.assertEquals(sys.stdout.getvalue(), '') expected = 'error: Invalid api key. Find your api key from wakatime.com/settings.' self.assertIn(expected, sys.stderr.getvalue()) log_output = u("\n").join([u(' ').join(x) for x in logs.actual()]) expected = '' self.assertEquals(log_output, expected) self.patched['wakatime.session_cache.SessionCache.get'].assert_not_called() self.patched['wakatime.session_cache.SessionCache.delete'].assert_not_called() self.patched['wakatime.session_cache.SessionCache.save'].assert_not_called() self.patched['wakatime.offlinequeue.Queue.push'].assert_not_called() self.patched['wakatime.offlinequeue.Queue.pop'].assert_not_called()
def test_400_response(self): response = Response() response.status_code = 400 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/twolinefile.txt' shutil.copy(entity, os.path.join(tempdir, 'twolinefile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'twolinefile.txt')) now = u(int(time.time())) key = str(uuid.uuid4()) heartbeat = { 'language': 'Text only', 'entity': 'HIDDEN.txt', 'project': None, 'time': float(now), 'type': 'file', 'is_write': False, 'user_agent': ANY, } args = ['--file', entity, '--key', key, '--config', 'tests/samples/configs/paranoid.cfg', '--time', now] retval = execute(args) self.assertEquals(retval, API_ERROR) self.assertNothingPrinted() self.assertHeartbeatSent(heartbeat) self.assertHeartbeatNotSavedOffline() self.assertOfflineHeartbeatsNotSynced() self.assertSessionCacheDeleted()
def test_nonascii_timezone(self): response = Response() response.status_code = 201 self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response with utils.TemporaryDirectory() as tempdir: entity = 'tests/samples/codefiles/emptyfile.txt' shutil.copy(entity, os.path.join(tempdir, 'emptyfile.txt')) entity = os.path.realpath(os.path.join(tempdir, 'emptyfile.txt')) class TZ(object): @property def zone(self): return 'tz汉语' if is_py3 else 'tz\xe6\xb1\x89\xe8\xaf\xad' timezone = TZ() with utils.mock.patch('wakatime.packages.tzlocal.get_localzone') as mock_getlocalzone: mock_getlocalzone.return_value = timezone config = 'tests/samples/configs/has_everything.cfg' args = ['--file', entity, '--config', config, '--timeout', '15'] retval = execute(args) self.assertEquals(retval, SUCCESS) self.patched['wakatime.session_cache.SessionCache.get'].assert_called_once_with() self.patched['wakatime.session_cache.SessionCache.delete'].assert_not_called() self.patched['wakatime.session_cache.SessionCache.save'].assert_called_once_with(ANY) self.patched['wakatime.offlinequeue.Queue.push'].assert_not_called() self.patched['wakatime.offlinequeue.Queue.pop'].assert_called_once_with() headers = self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].call_args[0][0].headers self.assertEquals(headers.get('TimeZone'), u(timezone.zone).encode('utf-8') if is_py3 else timezone.zone)
def test_push_handles_connection_exception(self): with tempfile.NamedTemporaryFile() as fh: with utils.mock.patch( 'wakatime.offlinequeue.Queue.get_db_file') as mock_db_file: mock_db_file.return_value = fh.name response = Response() response.status_code = 500 self.patched[ 'wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' config = 'tests/samples/configs/good_config.cfg' with utils.mock.patch( 'wakatime.offlinequeue.Queue.connect') as mock_connect: mock_connect.side_effect = sqlite3.Error('') args = [ '--file', entity, '--config', config, '--time', now ] execute(args) response.status_code = 201 execute(args) queue = Queue() saved_heartbeat = queue.pop() self.assertEquals(None, saved_heartbeat)