Commit 8e8c7612 authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Add a git pattern test

parent d67774a0
Loading
Loading
Loading
Loading

tests/__init__.py

0 → 100644
+6 −0
Original line number Diff line number Diff line
import sys
from os.path import join, dirname

# Use py-unittest-extra package from the project root if it is not installed on
# the system.
sys.path.append(join(dirname(dirname(__file__)), 'py-unittest-extra'))
+0 −0

Empty file added.

+0 −0

Empty file added.

+124 −0
Original line number Diff line number Diff line
import os
from os import path
from tempfile import mkdtemp
from contextlib import contextmanager, suppress
from itertools import chain

from unittest import TestCase
from unittest_extra import generator

from list_files import rules
from list_files.loaders import git


class PatternTest(TestCase, metaclass=generator.TestGeneratorMeta):

	ignore_rules = {}
	files = []

	@classmethod
	def setUpClass(cls):
		if os.getuid() == 0:
			raise OSError("Running these tests as root is unsafe: {0}"
					.format(cls))

	def setUp(self):
		self.tempdir = mkdtemp()
		self.orgcwd = os.getcwd()
		os.chdir(self.tempdir)

		for filename, contents in self.ignore_rules.items():
			with open(filename, 'w') as f:
				f.writelines(l + '\n' for l in contents)

		for filename, _ in self.files:
			if '/' in filename:
				with suppress(FileExistsError):
					os.makedirs(path.dirname(filename))
			with suppress(IsADirectoryError):
				open(filename, 'a').close()

		os.mkdir('.git')

		# force relevant environmental variables
		self.temphome = mkdtemp()
		os.environ['HOME'] = self.temphome
		os.environ['XDG_CONFIG_HOME'] = self.temphome

		if not git.GitLoader.is_project_root(self.tempdir):
			self.skipTest("Failed to generate a valid git project")
		self.loader = git.GitLoader(self.tempdir, '')

	def tearDown(self):
		file_iter = chain(
			os.walk(self.tempdir, False),
			os.walk(self.temphome, False)
		)

		os.chdir(self.orgcwd)
		for dirpath, dirnames, filenames in file_iter:
			for filename in filenames:
				os.unlink(path.join(dirpath, filename))
			os.rmdir(dirpath)


	@generator.test_generator('files')
	def patterns(self, filename, expect):
		# Check each parent directory of the file-path from the top of the
		# project down, against the pattern rules; stop if any part fails.

		parts = filename.split('/')
		for i in range(len(parts)):
			check_path = path.join(*parts[:i+1])

			result1 = rules.run_rules(self.loader.rules, check_path)
			result2 = rules.run_rules(self.loader.rules, check_path, parts[i])

			self.assertEqual(result1, result2)

			if result1 is False:
				self.assertFalse(expect)
				return

			if path.isdir(check_path):
				self.loader.load_from_dir(check_path)

		self.assertTrue(expect)


class SimplePatternTest(PatternTest):

	ignore_rules = {
		'.gitignore': [
			'*.a',
			'ignore/',
			'ignore-b-one/*.b',
			'ignore-b-all/**.b',
			],
	}

	files = [
		('file1.a', False),
		('file2.a', False),
		('file3.b', True),
		('dir1/file1.a', False),
		('dir1/file2.b', True),

		('ignore/', False),
		('ignore/file1.a', False),
		('ignore/file2.b', False),
		('ignore/dir1/file1.b', False),

		('ignore-b-one/file1.a', False),
		('ignore-b-one/file2.b', False),
		('ignore-b-one/file3.c', True),
		('ignore-b-one/dir1/file1.b', True),

		('ignore-b-all/file1.b', False),
		('ignore-b-all/dir1/file1.b', False),
	]


if __name__ == '__main__':
	from unittest import main
	main()