1from __future__ import unicode_literals
2
3import os
4import shutil
5
6from django.core.files.base import ContentFile
7from django.core.files.storage import FileSystemStorage
8from django.test import TestCase
9
10from pipeline import glob
11
12
13def local_path(path):
14    return os.path.join(os.path.dirname(__file__), path)
15
16
17class GlobTest(TestCase):
18    def normpath(self, *parts):
19        return os.path.normpath(os.path.join(*parts))
20
21    def mktemp(self, *parts):
22        filename = self.normpath(*parts)
23        base, file = os.path.split(filename)
24        base = os.path.join(self.storage.location, base)
25        if not os.path.exists(base):
26            os.makedirs(base)
27        self.storage.save(filename, ContentFile(""))
28
29    def assertSequenceEqual(self, l1, l2):
30        self.assertEqual(set(l1), set(l2))
31
32    def setUp(self):
33        self.storage = FileSystemStorage(local_path('glob_dir'))
34        self.old_storage = glob.staticfiles_storage
35        glob.staticfiles_storage = self.storage
36        self.mktemp('a', 'D')
37        self.mktemp('aab', 'F')
38        self.mktemp('aaa', 'zzzF')
39        self.mktemp('ZZZ')
40        self.mktemp('a', 'bcd', 'EF')
41        self.mktemp('a', 'bcd', 'efg', 'ha')
42
43    def glob(self, *parts):
44        if len(parts) == 1:
45            pattern = parts[0]
46        else:
47            pattern = os.path.join(*parts)
48        return glob.glob(pattern)
49
50    def tearDown(self):
51        shutil.rmtree(self.storage.location)
52        glob.staticfiles_storage = self.old_storage
53
54    def test_glob_literal(self):
55        self.assertSequenceEqual(self.glob('a'), [self.normpath('a')])
56        self.assertSequenceEqual(self.glob('a', 'D'), [self.normpath('a', 'D')])
57        self.assertSequenceEqual(self.glob('aab'), [self.normpath('aab')])
58
59    def test_glob_one_directory(self):
60        self.assertSequenceEqual(
61            self.glob('a*'), map(self.normpath, ['a', 'aab', 'aaa']))
62        self.assertSequenceEqual(
63            self.glob('*a'), map(self.normpath, ['a', 'aaa']))
64        self.assertSequenceEqual(
65            self.glob('aa?'), map(self.normpath, ['aaa', 'aab']))
66        self.assertSequenceEqual(
67            self.glob('aa[ab]'), map(self.normpath, ['aaa', 'aab']))
68        self.assertSequenceEqual(self.glob('*q'), [])
69
70    def test_glob_nested_directory(self):
71        if os.path.normcase("abCD") == "abCD":
72            # case-sensitive filesystem
73            self.assertSequenceEqual(
74                self.glob('a', 'bcd', 'E*'), [self.normpath('a', 'bcd', 'EF')])
75        else:
76            # case insensitive filesystem
77            self.assertSequenceEqual(self.glob('a', 'bcd', 'E*'), [
78                self.normpath('a', 'bcd', 'EF'),
79                self.normpath('a', 'bcd', 'efg')
80            ])
81        self.assertSequenceEqual(
82            self.glob('a', 'bcd', '*g'), [self.normpath('a', 'bcd', 'efg')])
83
84    def test_glob_directory_names(self):
85        self.assertSequenceEqual(
86            self.glob('*', 'D'), [self.normpath('a', 'D')])
87        self.assertSequenceEqual(self.glob('*', '*a'), [])
88        self.assertSequenceEqual(
89            self.glob('a', '*', '*', '*a'),
90            [self.normpath('a', 'bcd', 'efg', 'ha')])
91        self.assertSequenceEqual(
92            self.glob('?a?', '*F'),
93            map(self.normpath, [os.path.join('aaa', 'zzzF'),
94                os.path.join('aab', 'F')]))
95
96    def test_glob_directory_with_trailing_slash(self):
97        # We are verifying that when there is wildcard pattern which
98        # ends with os.sep doesn't blow up.
99        paths = glob.glob('*' + os.sep)
100        self.assertEqual(len(paths), 4)
101        self.assertTrue(all([os.sep in path for path in paths]))
102