From 5bf2c063a55c340d70131a6c1cd6ab014cadaf3f Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Wed, 20 Jul 2016 20:32:08 +0200 Subject: [PATCH] test for non-ascii filenames --- .../unicode/à-üñîčõdę-fìłë.txt | 0 tests/test_main.py | 57 ++++++++++++++++++- tests/test_offlinequeue.py | 6 +- tests/test_project.py | 2 +- 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 tests/samples/codefiles/unicode/à-üñîčõdę-fìłë.txt diff --git a/tests/samples/codefiles/unicode/à-üñîčõdę-fìłë.txt b/tests/samples/codefiles/unicode/à-üñîčõdę-fìłë.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_main.py b/tests/test_main.py index c0e89b4..af0116d 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -4,11 +4,13 @@ from wakatime.main import execute from wakatime.packages import requests +import logging import os import time import re import shutil import sys +from testfixtures import log_capture from wakatime.compat import u, is_py3 from wakatime.constants import ( API_ERROR, @@ -30,7 +32,7 @@ except ImportError: from wakatime.packages import tzlocal -class BaseTestCase(utils.TestCase): +class MainTestCase(utils.TestCase): patch_these = [ 'wakatime.packages.requests.adapters.HTTPAdapter.send', 'wakatime.offlinequeue.Queue.push', @@ -715,3 +717,56 @@ class BaseTestCase(utils.TestCase): data = json.loads(body) self.assertEquals(data.get('entity'), entity2) self.assertEquals(data.get('project'), project2) + + @log_capture() + def test_nonascii_filename(self, logs): + logging.disable(logging.NOTSET) + + response = Response() + response.status_code = 0 + self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].return_value = response + + with utils.TemporaryDirectory() as tempdir: + filename = os.listdir('tests/samples/codefiles/unicode')[0] + entity = os.path.join('tests/samples/codefiles/unicode', filename) + shutil.copy(entity, os.path.join(tempdir, filename)) + entity = os.path.realpath(os.path.join(tempdir, filename)) + + now = u(int(time.time())) + config = 'tests/samples/configs/good_config.cfg' + + args = ['--file', entity, '--key', '123', '--config', config, '--time', now] + + retval = execute(args) + self.assertEquals(retval, API_ERROR) + self.assertEquals(sys.stdout.getvalue(), '') + self.assertEquals(sys.stderr.getvalue(), '') + + output = [u(' ').join(x) for x in logs.actual()] + self.assertEquals(len(output), 0) + + 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': 'Text only', + 'lines': 0, + 'entity': os.path.realpath(entity), + 'project': os.path.basename(os.path.abspath('.')), + 'time': float(now), + 'type': 'file', + } + stats = { + u('cursorpos'): None, + u('dependencies'): [], + u('language'): u('Text only'), + u('lineno'): None, + u('lines'): 0, + } + + 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])) + self.patched['wakatime.offlinequeue.Queue.pop'].assert_not_called() diff --git a/tests/test_offlinequeue.py b/tests/test_offlinequeue.py index dfbfcab..504f166 100644 --- a/tests/test_offlinequeue.py +++ b/tests/test_offlinequeue.py @@ -185,7 +185,8 @@ class OfflineQueueTestCase(utils.TestCase): with utils.mock.patch('wakatime.offlinequeue.Queue.get_db_file') as mock_db_file: mock_db_file.return_value = fh.name - self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].side_effect = AttributeError("'Retry' object has no attribute 'history'") + exception_msg = u("Oops, requests raised an exception. You're move.") + self.patched['wakatime.packages.requests.adapters.HTTPAdapter.send'].side_effect = AttributeError(exception_msg) now = u(int(time.time())) entity = 'tests/samples/codefiles/twolinefile.txt' @@ -202,8 +203,7 @@ class OfflineQueueTestCase(utils.TestCase): self.assertEquals(sys.stderr.getvalue(), '') output = [u(' ').join(x) for x in logs.actual()] - expected = u("AttributeError: \\'Retry\\' object has no attribute \\'history\\'") - self.assertIn(expected, output[0]) + self.assertIn(exception_msg, output[0]) self.patched['wakatime.session_cache.SessionCache.get'].assert_called_once_with() self.patched['wakatime.session_cache.SessionCache.delete'].assert_has_calls([call(), call()]) diff --git a/tests/test_project.py b/tests/test_project.py index 78fcaad..06e17ab 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -18,7 +18,7 @@ from wakatime.projects.base import BaseProject from . import utils -class LanguagesTestCase(utils.TestCase): +class ProjectTestCase(utils.TestCase): patch_these = [ 'wakatime.packages.requests.adapters.HTTPAdapter.send', 'wakatime.offlinequeue.Queue.push',