244 lines
7.6 KiB
Python
244 lines
7.6 KiB
Python
# Copyright (c) 2008-2012 testtools developers. See LICENSE for details.
|
|
|
|
import os
|
|
import shutil
|
|
import tarfile
|
|
import tempfile
|
|
|
|
from testtools import TestCase
|
|
from testtools.matchers import (
|
|
Contains,
|
|
DocTestMatches,
|
|
Equals,
|
|
)
|
|
from testtools.matchers._filesystem import (
|
|
DirContains,
|
|
DirExists,
|
|
FileContains,
|
|
FileExists,
|
|
HasPermissions,
|
|
PathExists,
|
|
SamePath,
|
|
TarballContains,
|
|
)
|
|
|
|
|
|
class PathHelpers(object):
|
|
|
|
def mkdtemp(self):
|
|
directory = tempfile.mkdtemp()
|
|
self.addCleanup(shutil.rmtree, directory)
|
|
return directory
|
|
|
|
def create_file(self, filename, contents=''):
|
|
fp = open(filename, 'w')
|
|
try:
|
|
fp.write(contents)
|
|
finally:
|
|
fp.close()
|
|
|
|
def touch(self, filename):
|
|
return self.create_file(filename)
|
|
|
|
|
|
class TestPathExists(TestCase, PathHelpers):
|
|
|
|
def test_exists(self):
|
|
tempdir = self.mkdtemp()
|
|
self.assertThat(tempdir, PathExists())
|
|
|
|
def test_not_exists(self):
|
|
doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
|
|
mismatch = PathExists().match(doesntexist)
|
|
self.assertThat(
|
|
"%s does not exist." % doesntexist, Equals(mismatch.describe()))
|
|
|
|
|
|
class TestDirExists(TestCase, PathHelpers):
|
|
|
|
def test_exists(self):
|
|
tempdir = self.mkdtemp()
|
|
self.assertThat(tempdir, DirExists())
|
|
|
|
def test_not_exists(self):
|
|
doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
|
|
mismatch = DirExists().match(doesntexist)
|
|
self.assertThat(
|
|
PathExists().match(doesntexist).describe(),
|
|
Equals(mismatch.describe()))
|
|
|
|
def test_not_a_directory(self):
|
|
filename = os.path.join(self.mkdtemp(), 'foo')
|
|
self.touch(filename)
|
|
mismatch = DirExists().match(filename)
|
|
self.assertThat(
|
|
"%s is not a directory." % filename, Equals(mismatch.describe()))
|
|
|
|
|
|
class TestFileExists(TestCase, PathHelpers):
|
|
|
|
def test_exists(self):
|
|
tempdir = self.mkdtemp()
|
|
filename = os.path.join(tempdir, 'filename')
|
|
self.touch(filename)
|
|
self.assertThat(filename, FileExists())
|
|
|
|
def test_not_exists(self):
|
|
doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
|
|
mismatch = FileExists().match(doesntexist)
|
|
self.assertThat(
|
|
PathExists().match(doesntexist).describe(),
|
|
Equals(mismatch.describe()))
|
|
|
|
def test_not_a_file(self):
|
|
tempdir = self.mkdtemp()
|
|
mismatch = FileExists().match(tempdir)
|
|
self.assertThat(
|
|
"%s is not a file." % tempdir, Equals(mismatch.describe()))
|
|
|
|
|
|
class TestDirContains(TestCase, PathHelpers):
|
|
|
|
def test_empty(self):
|
|
tempdir = self.mkdtemp()
|
|
self.assertThat(tempdir, DirContains([]))
|
|
|
|
def test_not_exists(self):
|
|
doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
|
|
mismatch = DirContains([]).match(doesntexist)
|
|
self.assertThat(
|
|
PathExists().match(doesntexist).describe(),
|
|
Equals(mismatch.describe()))
|
|
|
|
def test_contains_files(self):
|
|
tempdir = self.mkdtemp()
|
|
self.touch(os.path.join(tempdir, 'foo'))
|
|
self.touch(os.path.join(tempdir, 'bar'))
|
|
self.assertThat(tempdir, DirContains(['bar', 'foo']))
|
|
|
|
def test_matcher(self):
|
|
tempdir = self.mkdtemp()
|
|
self.touch(os.path.join(tempdir, 'foo'))
|
|
self.touch(os.path.join(tempdir, 'bar'))
|
|
self.assertThat(tempdir, DirContains(matcher=Contains('bar')))
|
|
|
|
def test_neither_specified(self):
|
|
self.assertRaises(AssertionError, DirContains)
|
|
|
|
def test_both_specified(self):
|
|
self.assertRaises(
|
|
AssertionError, DirContains, filenames=[], matcher=Contains('a'))
|
|
|
|
def test_does_not_contain_files(self):
|
|
tempdir = self.mkdtemp()
|
|
self.touch(os.path.join(tempdir, 'foo'))
|
|
mismatch = DirContains(['bar', 'foo']).match(tempdir)
|
|
self.assertThat(
|
|
Equals(['bar', 'foo']).match(['foo']).describe(),
|
|
Equals(mismatch.describe()))
|
|
|
|
|
|
class TestFileContains(TestCase, PathHelpers):
|
|
|
|
def test_not_exists(self):
|
|
doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
|
|
mismatch = FileContains('').match(doesntexist)
|
|
self.assertThat(
|
|
PathExists().match(doesntexist).describe(),
|
|
Equals(mismatch.describe()))
|
|
|
|
def test_contains(self):
|
|
tempdir = self.mkdtemp()
|
|
filename = os.path.join(tempdir, 'foo')
|
|
self.create_file(filename, 'Hello World!')
|
|
self.assertThat(filename, FileContains('Hello World!'))
|
|
|
|
def test_matcher(self):
|
|
tempdir = self.mkdtemp()
|
|
filename = os.path.join(tempdir, 'foo')
|
|
self.create_file(filename, 'Hello World!')
|
|
self.assertThat(
|
|
filename, FileContains(matcher=DocTestMatches('Hello World!')))
|
|
|
|
def test_neither_specified(self):
|
|
self.assertRaises(AssertionError, FileContains)
|
|
|
|
def test_both_specified(self):
|
|
self.assertRaises(
|
|
AssertionError, FileContains, contents=[], matcher=Contains('a'))
|
|
|
|
def test_does_not_contain(self):
|
|
tempdir = self.mkdtemp()
|
|
filename = os.path.join(tempdir, 'foo')
|
|
self.create_file(filename, 'Goodbye Cruel World!')
|
|
mismatch = FileContains('Hello World!').match(filename)
|
|
self.assertThat(
|
|
Equals('Hello World!').match('Goodbye Cruel World!').describe(),
|
|
Equals(mismatch.describe()))
|
|
class TestTarballContains(TestCase, PathHelpers):
|
|
|
|
def test_match(self):
|
|
tempdir = self.mkdtemp()
|
|
in_temp_dir = lambda x: os.path.join(tempdir, x)
|
|
self.touch(in_temp_dir('a'))
|
|
self.touch(in_temp_dir('b'))
|
|
tarball = tarfile.open(in_temp_dir('foo.tar.gz'), 'w')
|
|
tarball.add(in_temp_dir('a'), 'a')
|
|
tarball.add(in_temp_dir('b'), 'b')
|
|
tarball.close()
|
|
self.assertThat(
|
|
in_temp_dir('foo.tar.gz'), TarballContains(['b', 'a']))
|
|
|
|
def test_mismatch(self):
|
|
tempdir = self.mkdtemp()
|
|
in_temp_dir = lambda x: os.path.join(tempdir, x)
|
|
self.touch(in_temp_dir('a'))
|
|
self.touch(in_temp_dir('b'))
|
|
tarball = tarfile.open(in_temp_dir('foo.tar.gz'), 'w')
|
|
tarball.add(in_temp_dir('a'), 'a')
|
|
tarball.add(in_temp_dir('b'), 'b')
|
|
tarball.close()
|
|
mismatch = TarballContains(['d', 'c']).match(in_temp_dir('foo.tar.gz'))
|
|
self.assertEqual(
|
|
mismatch.describe(),
|
|
Equals(['c', 'd']).match(['a', 'b']).describe())
|
|
|
|
|
|
class TestSamePath(TestCase, PathHelpers):
|
|
|
|
def test_same_string(self):
|
|
self.assertThat('foo', SamePath('foo'))
|
|
|
|
def test_relative_and_absolute(self):
|
|
path = 'foo'
|
|
abspath = os.path.abspath(path)
|
|
self.assertThat(path, SamePath(abspath))
|
|
self.assertThat(abspath, SamePath(path))
|
|
|
|
def test_real_path(self):
|
|
tempdir = self.mkdtemp()
|
|
source = os.path.join(tempdir, 'source')
|
|
self.touch(source)
|
|
target = os.path.join(tempdir, 'target')
|
|
try:
|
|
os.symlink(source, target)
|
|
except (AttributeError, NotImplementedError):
|
|
self.skip("No symlink support")
|
|
self.assertThat(source, SamePath(target))
|
|
self.assertThat(target, SamePath(source))
|
|
|
|
|
|
class TestHasPermissions(TestCase, PathHelpers):
|
|
|
|
def test_match(self):
|
|
tempdir = self.mkdtemp()
|
|
filename = os.path.join(tempdir, 'filename')
|
|
self.touch(filename)
|
|
permissions = oct(os.stat(filename).st_mode)[-4:]
|
|
self.assertThat(filename, HasPermissions(permissions))
|
|
|
|
|
|
def test_suite():
|
|
from unittest import TestLoader
|
|
return TestLoader().loadTestsFromName(__name__)
|