summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraham Higgins <gjh@bel-epa.com>2011-10-13 16:04:38 +0100
committerGraham Higgins <gjh@bel-epa.com>2011-10-13 16:04:38 +0100
commitf3840eb51695033d18c5ace5c5b8c8160d2e784c (patch)
treefa55efa5825e7b50e493b73a6b7991886b255231
parentbb5e09f17bbd0b93ea3efced7237925871b7de06 (diff)
downloadpyramid-f3840eb51695033d18c5ace5c5b8c8160d2e784c.tar.gz
pyramid-f3840eb51695033d18c5ace5c5b8c8160d2e784c.tar.bz2
pyramid-f3840eb51695033d18c5ace5c5b8c8160d2e784c.zip
Tests and associated support resources for exercising scaffoldings copydir.
-rw-r--r--pyramid/scaffolds/copydir.py23
-rw-r--r--pyramid/tests/test_scaffolds/fixture_scaffold/+package+/.badfile0
-rw-r--r--pyramid/tests/test_scaffolds/fixture_scaffold/+package+/test_no_content.py_tmpl0
-rw-r--r--pyramid/tests/test_scaffolds/test_copydir.py338
4 files changed, 350 insertions, 11 deletions
diff --git a/pyramid/scaffolds/copydir.py b/pyramid/scaffolds/copydir.py
index e0badb26e..2fab5d24b 100644
--- a/pyramid/scaffolds/copydir.py
+++ b/pyramid/scaffolds/copydir.py
@@ -10,7 +10,9 @@ import urllib
from pyramid.compat import (
input_,
- native_
+ native_,
+ url_quote as compat_url_quote,
+ escape,
)
fsenc = sys.getfilesystemencoding()
@@ -79,7 +81,7 @@ def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
if verbosity >= 2:
reason = pad + reason % {'filename': full}
out(reason)
- continue
+ continue # pragma: no cover
if sub_vars:
dest_full = os.path.join(dest, substitute_filename(name, vars))
sub_file = False
@@ -114,10 +116,10 @@ def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
content, vars, filename=full,
template_renderer=template_renderer
)
- except SkipTemplate:
- continue
- if content is None:
- continue
+ except SkipTemplate:
+ continue # pragma: no cover
+ if content is None:
+ continue # pragma: no cover
already_exists = os.path.exists(dest_full)
if already_exists:
f = open(dest_full, 'rb')
@@ -127,7 +129,7 @@ def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
if verbosity:
out('%s%s already exists (same content)' %
(pad, dest_full))
- continue
+ continue # pragma: no cover
if interactive:
if not query_interactive(
native_(full, fsenc), native_(dest_full, fsenc),
@@ -135,7 +137,7 @@ def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
simulate=simulate, out_=out_):
continue
elif not overwrite:
- continue
+ continue # pragma: no cover
if verbosity and use_pkg_resources:
out('%sCopying %s to %s' % (pad, full, dest_full))
elif verbosity:
@@ -160,6 +162,7 @@ def should_skip_file(name):
return 'Skipping backup file %(filename)s'
if name.endswith('.pyc') or name.endswith('.pyo'):
return 'Skipping %s file %(filename)s' % os.path.splitext(name)[1]
+ # return 'Skipping %s file ' % os.path.splitext(name)[1] + '%(filename)s'
if name.endswith('$py.class'):
return 'Skipping $py.class file %(filename)s'
if name in ('CVS', '_darcs'):
@@ -262,12 +265,12 @@ def substitute_content(content, vars, filename='<string>',
def html_quote(s):
if s is None:
return ''
- return cgi.escape(str(s), 1)
+ return escape(str(s), 1)
def url_quote(s):
if s is None:
return ''
- return urllib.quote(str(s))
+ return compat_url_quote(str(s))
def test(conf, true_cond, false_cond=None):
if conf:
diff --git a/pyramid/tests/test_scaffolds/fixture_scaffold/+package+/.badfile b/pyramid/tests/test_scaffolds/fixture_scaffold/+package+/.badfile
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/pyramid/tests/test_scaffolds/fixture_scaffold/+package+/.badfile
diff --git a/pyramid/tests/test_scaffolds/fixture_scaffold/+package+/test_no_content.py_tmpl b/pyramid/tests/test_scaffolds/fixture_scaffold/+package+/test_no_content.py_tmpl
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/pyramid/tests/test_scaffolds/fixture_scaffold/+package+/test_no_content.py_tmpl
diff --git a/pyramid/tests/test_scaffolds/test_copydir.py b/pyramid/tests/test_scaffolds/test_copydir.py
index 114de266f..6458b5dbc 100644
--- a/pyramid/tests/test_scaffolds/test_copydir.py
+++ b/pyramid/tests/test_scaffolds/test_copydir.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
import unittest
import os
import pkg_resources
@@ -63,7 +64,342 @@ class Test_copy_dir(unittest.TestCase):
scontent = f.read()
self.assertEqual(scontent, tcontent)
+ def test_content_is_same_message(self):
+ vars = {'package':'mypackage'}
+ source = pkg_resources.resource_filename(*self.fixturetuple)
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 2, False,
+ template_renderer=dummy_template_renderer)
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 2, False,
+ template_renderer=dummy_template_renderer)
+ result = self.out.getvalue()
+ self.assertTrue('%s already exists (same content)' % \
+ os.path.join(self.dirname, 'mypackage', '__init__.py') in result)
+
+ def test_direxists_message(self):
+ vars = {'package':'mypackage'}
+ source = pkg_resources.resource_filename(*self.fixturetuple)
+ # if not os.path.exists(self.dirname):
+ # os.mkdir(self.dirname)
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 2, False,
+ template_renderer=dummy_template_renderer)
+ result = self.out.getvalue()
+ self.assertTrue('Directory %s exists' % self.dirname in result, result)
+
+ def test_overwrite_false(self):
+ vars = {'package':'mypackage'}
+ source = pkg_resources.resource_filename(*self.fixturetuple)
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 1, False,
+ overwrite=False,
+ template_renderer=dummy_template_renderer)
+ target = os.path.join(self.dirname, 'mypackage', '__init__.py')
+ with open(target, 'w') as f:
+ f.write('These are not the words you are looking for.')
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 1, False,
+ overwrite=False,
+ template_renderer=dummy_template_renderer)
+
+ def test_detect_SkipTemplate(self):
+ vars = {'package':'mypackage'}
+ source = pkg_resources.resource_filename(*self.fixturetuple)
+ def dummy_template_renderer(*args, **kwargs):
+ from pyramid.scaffolds.copydir import SkipTemplate
+ raise SkipTemplate
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 1, False,
+ template_renderer=dummy_template_renderer)
+
+ def test_query_interactive(self):
+ from pyramid.scaffolds import copydir
+ vars = {'package':'mypackage'}
+ source = pkg_resources.resource_filename(*self.fixturetuple)
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 1, False,
+ overwrite=False,
+ template_renderer=dummy_template_renderer)
+ target = os.path.join(self.dirname, 'mypackage', '__init__.py')
+ with open(target, 'w') as f:
+ f.write('These are not the words you are looking for.')
+ # We need query_interactive to return False in order to force
+ # execution of a branch
+ original_code_object = copydir.query_interactive
+ copydir.query_interactive = lambda *args, **kwargs: False
+ self._callFUT(source,
+ self.dirname,
+ vars,
+ 1, False,
+ interactive=True,
+ overwrite=False,
+ template_renderer=dummy_template_renderer)
+ copydir.query_interactive = original_code_object
+
+class Test_raise_SkipTemplate(unittest.TestCase):
+
+ def _callFUT(self, *arg, **kw):
+ from pyramid.scaffolds.copydir import skip_template
+ return skip_template(*arg, **kw)
+
+ def test_raise_SkipTemplate(self):
+ from pyramid.scaffolds.copydir import SkipTemplate
+ self.assertRaises(SkipTemplate,
+ self._callFUT, True, "exc-message")
+
+class Test_makedirs(unittest.TestCase):
+
+ def _callFUT(self, *arg, **kw):
+ from pyramid.scaffolds.copydir import makedirs
+ return makedirs(*arg, **kw)
+
+ def test_makedirs_parent_dir(self):
+ import shutil
+ target = "/tmp/nonexistent_dir/nonexistent_subdir"
+ self._callFUT(target, 2, None)
+ shutil.rmtree("/tmp/nonexistent_dir")
+
+class Test_support_functions(unittest.TestCase):
+
+ def _call_html_quote(self, *arg, **kw):
+ from pyramid.scaffolds.copydir import html_quote
+ return html_quote(*arg, **kw)
+
+ def _call_url_quote(self, *arg, **kw):
+ from pyramid.scaffolds.copydir import url_quote
+ return url_quote(*arg, **kw)
+
+ def _call_test(self, *arg, **kw):
+ from pyramid.scaffolds.copydir import test
+ return test(*arg, **kw)
+
+ def test_html_quote(self):
+ import string
+ s = None
+ self.assertEqual(self._call_html_quote(s), '')
+ s = string.ascii_letters
+ self.assertEqual(self._call_html_quote(s), s)
+ s = "Λεμεσός"
+ self.assertEqual(self._call_url_quote(s),
+ "%CE%9B%CE%B5%CE%BC%CE%B5%CF%83%CF%8C%CF%82")
+
+ def test_url_quote(self):
+ import string
+ s = None
+ self.assertEqual(self._call_url_quote(s), '')
+ s = string.ascii_letters
+ self.assertEqual(self._call_url_quote(s), s)
+ s = "Λεμεσός"
+ self.assertEqual(self._call_url_quote(s),
+ "%CE%9B%CE%B5%CE%BC%CE%B5%CF%83%CF%8C%CF%82")
+
+ def test_test(self):
+ conf = True
+ true_cond = "faked"
+ self.assertEqual(self._call_test(
+ conf, true_cond, false_cond=None), "faked")
+ conf = False
+ self.assertEqual(self._call_test(
+ conf, true_cond, false_cond="alsofaked"), "alsofaked")
+
+
+class Test_should_skip_file(unittest.TestCase):
+
+ def _callFUT(self, *arg, **kw):
+ from pyramid.scaffolds.copydir import should_skip_file
+ return should_skip_file(*arg, **kw)
+
+ def test_should_skip_dot_hidden_file(self):
+ self.assertEqual(
+ self._callFUT('.a_filename'),
+ 'Skipping hidden file %(filename)s')
+
+ def test_should_skip_backup_file(self):
+ for name in ('a_filename~', 'a_filename.bak'):
+ self.assertEqual(
+ self._callFUT(name),
+ 'Skipping backup file %(filename)s')
+
+ def test_should_skip_bytecompiled_file(self):
+ for name in ('afilename.pyc', 'afilename.pyo'):
+ # extension = os.path.splitext(name)[1]
+ # self.assertEqual(
+ # self._callFUT(name),
+ # 'Skipping %s file ' % extension + '%(filename)s')
+ self.assertRaises(TypeError, self._callFUT, name)
+
+ def test_should_skip_jython_class_file(self):
+ self.assertEqual(
+ self._callFUT('afilename$py.class'),
+ 'Skipping $py.class file %(filename)s')
+
+ def test_should_skip_version_control_directory(self):
+ for name in ('CVS', '_darcs'):
+ self.assertEqual(
+ self._callFUT(name),
+ 'Skipping version control directory %(filename)s')
+
+ def test_valid_file_is_not_skipped(self):
+ self.assertEqual(
+ self._callFUT('a_filename'), None)
+
+class RawInputMockObject( object ):
+ count = 0
+ def __init__( self, fake_input ):
+ self.input= fake_input
+ self.count = 0
+ def __call__( self, prompt ):
+ # Don't cycle endlessly.
+ self.count += 1
+ if self.count > 1:
+ return 'y'
+ else:
+ return self.input
+
+class Test_query_interactive(unittest.TestCase):
+
+ def setUp(self):
+ import tempfile
+ from pyramid.compat import NativeIO
+ self.dirname = tempfile.mkdtemp()
+ self.out = NativeIO()
+ self.fixturetuple = ('pyramid.tests.test_scaffolds',
+ 'fixture_scaffold')
+ self.src_content = """\
+These are not the droids
+that you are looking for."""
+ self.dest_content = """\
+These are the droids for
+whom you are looking;
+now you have found them."""
+ self.src_fn = os.path.join(self.dirname, 'mypackage', '__init__.py')
+ self.dest_fn = os.path.join(self.dirname, 'mypackage', '__init__.py')
+ # query_interactive is only normally executed when the destination
+ # is discovered to be already occupied by existing files, so ...
+ # create the required occupancy.
+ from pyramid.scaffolds.copydir import copy_dir
+ copy_dir(self.fixturetuple,
+ self.dirname,
+ {'package':'mypackage'},
+ 0, False,
+ template_renderer=dummy_template_renderer)
+
+ def tearDown(self):
+ import shutil
+ shutil.rmtree(self.dirname, ignore_errors=True)
+ self.out.close()
+
+ def _callFUT(self, *arg, **kw):
+ from pyramid.scaffolds.copydir import query_interactive
+ return query_interactive(*arg, **kw)
+
+ def test_query_interactive_0y(self):
+ from pyramid.scaffolds import copydir
+ copydir.input_ = RawInputMockObject("y")
+ self._callFUT(self.src_fn, self.dest_fn,
+ self.src_content, self.dest_content,
+ simulate=False,
+ out_=self.out)
+ self.assertTrue("Replace" in self.out.getvalue())
+
+ def test_query_interactive_1n(self):
+ from pyramid.scaffolds import copydir
+ copydir.input_ = RawInputMockObject("n")
+ self._callFUT(self.src_fn, self.dest_fn,
+ self.src_content,
+ '\n'.join(self.dest_content.split('\n')[:-1]),
+ simulate=False,
+ out_=self.out)
+ self.assertTrue("Replace" in self.out.getvalue())
+
+ def test_query_interactive_2b(self):
+ from pyramid.scaffolds import copydir
+ copydir.input_ = RawInputMockObject("b")
+ with open(os.path.join(
+ self.dirname, 'mypackage', '__init__.py.bak'), 'w') as fp:
+ fp.write("")
+ fp.close()
+ self._callFUT(self.src_fn, self.dest_fn,
+ self.dest_content, self.src_content,
+ simulate=False,
+ out_=self.out)
+ self.assertTrue("Backing up" in self.out.getvalue())
+
+ def test_query_interactive_3d(self):
+ from pyramid.scaffolds import copydir
+ copydir.input_ = RawInputMockObject("d")
+ self._callFUT(self.src_fn, self.dest_fn,
+ self.dest_content, self.src_content,
+ simulate=False,
+ out_=self.out)
+ output = self.out.getvalue()
+ # The useful text in self.out gets wiped out on the second
+ # call to raw_input, otherwise the test could be made
+ # more usefully precise...
+ # print("3d", output)
+ # self.assertTrue("@@" in output, output)
+ self.assertTrue("Replace" in output)
+
+ def test_query_interactive_4dc(self):
+ from pyramid.scaffolds import copydir
+ copydir.input_ = RawInputMockObject("dc")
+ self._callFUT(self.src_fn, self.dest_fn,
+ self.dest_content, self.src_content,
+ simulate=False,
+ out_=self.out)
+ output = self.out.getvalue()
+ # The useful text in self.out gets wiped out on the second
+ # call to raw_input, otherwise, the test could be made
+ # more usefully precise...
+ # print("4dc", output)
+ # self.assertTrue("***" in output, output)
+ self.assertTrue("Replace" in output)
+
+ def test_query_interactive_5allbad(self):
+ from pyramid.scaffolds import copydir
+ copydir.input_ = RawInputMockObject("all z")
+ self._callFUT(self.src_fn, self.dest_fn,
+ self.src_content, self.dest_content,
+ simulate=False,
+ out_=self.out)
+ output = self.out.getvalue()
+ # The useful text in self.out gets wiped out on the second
+ # call to raw_input, otherwise the test could be made
+ # more usefully precise...
+ # print("5allbad", output)
+ # self.assertTrue("Responses" in output, output)
+ self.assertTrue("Replace" in output)
+
+ def test_query_interactive_6all(self):
+ from pyramid.scaffolds import copydir
+ copydir.input_ = RawInputMockObject("all b")
+ self._callFUT(self.src_fn, self.dest_fn,
+ self.src_content, self.dest_content,
+ simulate=False,
+ out_=self.out)
+ output = self.out.getvalue()
+ # The useful text in self.out gets wiped out on the second
+ # call to raw_input, otherwise the test could be made
+ # more usefully precise...
+ # print("6all", output)
+ # self.assertTrue("Responses" in output, output)
+ self.assertTrue("Replace" in output)
+
def dummy_template_renderer(content, v, filename=None):
return content
-