summaryrefslogtreecommitdiff
path: root/lib/fixtures/tests/_fixtures/test_tempdir.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fixtures/tests/_fixtures/test_tempdir.py')
-rw-r--r--lib/fixtures/tests/_fixtures/test_tempdir.py157
1 files changed, 153 insertions, 4 deletions
diff --git a/lib/fixtures/tests/_fixtures/test_tempdir.py b/lib/fixtures/tests/_fixtures/test_tempdir.py
index 1e42257..c253a68 100644
--- a/lib/fixtures/tests/_fixtures/test_tempdir.py
+++ b/lib/fixtures/tests/_fixtures/test_tempdir.py
@@ -1,6 +1,6 @@
# fixtures: Fixtures with cleanups for testing and convenience.
#
-# Copyright (c) 2010, Robert Collins <robertc@robertcollins.net>
+# Copyright (c) 2010, 2012 Robert Collins <robertc@robertcollins.net>
#
# Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
# license at the users choice. A copy of both licenses are available in the
@@ -17,19 +17,30 @@ import os
import tempfile
import testtools
-from testtools.matchers import StartsWith
+from testtools.matchers import (
+ DirContains,
+ DirExists,
+ FileContains,
+ StartsWith,
+ )
from fixtures import (
NestedTempfile,
TempDir,
)
+from fixtures._fixtures.tempdir import (
+ create_normal_shape,
+ normalize_entry,
+ normalize_shape,
+ )
+from fixtures.tests.helpers import HasNoAttribute
+
class TestTempDir(testtools.TestCase):
def test_basic(self):
fixture = TempDir()
- sentinel = object()
- self.assertEqual(sentinel, getattr(fixture, 'path', sentinel))
+ self.assertThat(fixture, HasNoAttribute('path'))
fixture.setUp()
try:
path = fixture.path
@@ -72,3 +83,141 @@ class NestedTempfileTest(testtools.TestCase):
raise ContrivedException
except ContrivedException:
self.assertFalse(os.path.isdir(nested_tempdir))
+
+
+class TestFileTree(testtools.TestCase):
+
+ def test_out_of_order(self):
+ # If a file or a subdirectory is listed before its parent directory,
+ # that doesn't matter. We'll create the directory first.
+ fixture = TempDir()
+ with fixture:
+ fixture.make_tree('a/b/', 'a/')
+ path = fixture.path
+ self.assertThat(path, DirContains(['a']))
+ self.assertThat(os.path.join(path, 'a'), DirContains(['b']))
+ self.assertThat(os.path.join(path, 'a', 'b'), DirExists())
+
+ def test_not_even_creating_parents(self):
+ fixture = TempDir()
+ with fixture:
+ fixture.make_tree('a/b/foo.txt', 'c/d/e/')
+ path = fixture.path
+ self.assertThat(
+ os.path.join(path, 'a', 'b', 'foo.txt'),
+ FileContains("The file 'a/b/foo.txt'."))
+ self.assertThat(os.path.join(path, 'c', 'd', 'e'), DirExists())
+
+
+class TestNormalizeEntry(testtools.TestCase):
+
+ def test_file_as_tuple(self):
+ # A tuple of filenames and contents is already normalized.
+ entry = normalize_entry(('foo', 'foo contents'))
+ self.assertEqual(('foo', 'foo contents'), entry)
+
+ def test_directories_as_tuples(self):
+ # A tuple of directory name and None is already normalized.
+ directory = normalize_entry(('foo/', None))
+ self.assertEqual(('foo/', None), directory)
+
+ def test_directories_as_singletons(self):
+ # A singleton tuple of directory name is normalized to a 2-tuple of
+ # the directory name and None.
+ directory = normalize_entry(('foo/',))
+ self.assertEqual(('foo/', None), directory)
+
+ def test_directories_as_strings(self):
+ # If directories are just given as strings, then they are normalized
+ # to tuples of directory names and None.
+ directory = normalize_entry('foo/')
+ self.assertEqual(('foo/', None), directory)
+
+ def test_directories_with_content(self):
+ # If we're given a directory with content, we raise an error, since
+ # it's ambiguous and we don't want to guess.
+ bad_entry = ('dir/', "stuff")
+ e = self.assertRaises(ValueError, normalize_entry, bad_entry)
+ self.assertEqual(
+ "Directories must end with '/' and have no content, files do not "
+ "end with '/' and must have content, got %r" % (bad_entry,),
+ str(e))
+
+ def test_filenames_as_strings(self):
+ # If file names are just given as strings, then they are normalized to
+ # tuples of filenames and made-up contents.
+ entry = normalize_entry('foo')
+ self.assertEqual(('foo', "The file 'foo'."), entry)
+
+ def test_filenames_as_singletons(self):
+ # A singleton tuple of a filename is normalized to a 2-tuple of
+ # the file name and made-up contents.
+ entry = normalize_entry(('foo',))
+ self.assertEqual(('foo', "The file 'foo'."), entry)
+
+ def test_filenames_without_content(self):
+ # If we're given a filename without content, we raise an error, since
+ # it's ambiguous and we don't want to guess.
+ bad_entry = ('filename', None)
+ e = self.assertRaises(ValueError, normalize_entry, bad_entry)
+ self.assertEqual(
+ "Directories must end with '/' and have no content, files do not "
+ "end with '/' and must have content, got %r" % (bad_entry,),
+ str(e))
+
+ def test_too_long_tuple(self):
+ bad_entry = ('foo', 'bar', 'baz')
+ e = self.assertRaises(ValueError, normalize_entry, bad_entry)
+ self.assertEqual(
+ "Invalid file or directory description: %r" % (bad_entry,),
+ str(e))
+
+
+class TestNormalizeShape(testtools.TestCase):
+
+ def test_empty(self):
+ # The normal form of an empty list is the empty list.
+ empty = normalize_shape([])
+ self.assertEqual([], empty)
+
+ def test_sorts_entries(self):
+ # The normal form a list of entries is the sorted list of normal
+ # entries.
+ entries = normalize_shape(['a/b/', 'a/'])
+ self.assertEqual([('a/', None), ('a/b/', None)], entries)
+
+
+class TestCreateNormalShape(testtools.TestCase):
+
+ def test_empty(self):
+ tempdir = self.useFixture(TempDir()).path
+ create_normal_shape(tempdir, [])
+ self.assertThat(tempdir, DirContains([]))
+
+ def test_creates_files(self):
+ # When given a list of file specifications, it creates those files
+ # underneath the temporary directory.
+ path = self.useFixture(TempDir()).path
+ create_normal_shape(path, [('a', 'foo'), ('b', 'bar')])
+ self.assertThat(path, DirContains(['a', 'b']))
+ self.assertThat(os.path.join(path, 'a'), FileContains('foo'))
+ self.assertThat(os.path.join(path, 'b'), FileContains('bar'))
+
+ def test_creates_directories(self):
+ # When given directory specifications, it creates those directories.
+ path = self.useFixture(TempDir()).path
+ create_normal_shape(path, [('a/', None), ('b/', None)])
+ self.assertThat(path, DirContains(['a', 'b']))
+ self.assertThat(os.path.join(path, 'a'), DirExists())
+ self.assertThat(os.path.join(path, 'b'), DirExists())
+
+ def test_creates_parent_directories(self):
+ # If the parents of a file or directory don't exist, they get created
+ # too.
+ path = self.useFixture(TempDir()).path
+ create_normal_shape(path, [('a/b/', None), ('c/d.txt', 'text')])
+ self.assertThat(path, DirContains(['a', 'c']))
+ self.assertThat(os.path.join(path, 'a'), DirContains('b'))
+ self.assertThat(os.path.join(path, 'a', 'b'), DirExists())
+ self.assertThat(os.path.join(path, 'c'), DirExists())
+ self.assertThat(os.path.join(path, 'c', 'd.txt'), FileContains('text'))