comparison tests/mockutil.py @ 11:617191dec18e

Fixes for Windows, make `findPagePath` return a ref path.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 18 Aug 2014 16:47:44 -0700
parents f5ca5c5bed85
children 644869022b6e
comparison
equal deleted inserted replaced
10:cd35d356ccce 11:617191dec18e
38 self.withDir('counter') 38 self.withDir('counter')
39 self.withFile('kitchen/_content/config.yml', 39 self.withFile('kitchen/_content/config.yml',
40 "site:\n title: Mock Website\n") 40 "site:\n title: Mock Website\n")
41 41
42 def path(self, p): 42 def path(self, p):
43 p = p.replace('\\', '/')
43 if p in ['/', '', None]: 44 if p in ['/', '', None]:
44 return '/%s' % self._root 45 return '/%s' % self._root
45 return '/%s/%s' % (self._root, p.lstrip('/')) 46 return '/%s/%s' % (self._root, p.lstrip('/'))
46 47
47 def getApp(self): 48 def getApp(self):
48 root_dir = self.path('/kitchen') 49 root_dir = self.path('/kitchen')
49 return PieCrust(root_dir, cache=False) 50 return PieCrust(root_dir, cache=False)
50 51
51 def withDir(self, path): 52 def withDir(self, path):
53 path = path.replace('\\', '/')
52 cur = self._fs[self._root] 54 cur = self._fs[self._root]
53 for b in path.split('/'): 55 for b in path.split('/'):
54 if b not in cur: 56 if b not in cur:
55 cur[b] = {} 57 cur[b] = {}
56 cur = cur[b] 58 cur = cur[b]
57 return self 59 return self
58 60
59 def withFile(self, path, contents): 61 def withFile(self, path, contents):
62 path = path.replace('\\', '/')
60 cur = self._fs[self._root] 63 cur = self._fs[self._root]
61 bits = path.split('/') 64 bits = path.split('/')
62 for b in bits[:-1]: 65 for b in bits[:-1]:
63 if b not in cur: 66 if b not in cur:
64 cur[b] = {} 67 cur[b] = {}
71 74
72 def withAssetDir(self, path): 75 def withAssetDir(self, path):
73 return self.withDir('kitchen/' + path) 76 return self.withDir('kitchen/' + path)
74 77
75 def withConfig(self, config): 78 def withConfig(self, config):
76 return self.withFile('kitchen/_content/config.yml', 79 return self.withFile(
80 'kitchen/_content/config.yml',
77 yaml.dump(config)) 81 yaml.dump(config))
78 82
79 def withThemeConfig(self, config): 83 def withThemeConfig(self, config):
80 return self.withFile('kitchen/_content/theme/_content/theme_config.yml', 84 return self.withFile(
85 'kitchen/_content/theme/_content/theme_config.yml',
81 yaml.dump(config)) 86 yaml.dump(config))
82 87
83 def withPage(self, url, config=None, contents=None): 88 def withPage(self, url, config=None, contents=None):
84 config = config or {} 89 config = config or {}
85 contents = contents or "A test page." 90 contents = contents or "A test page."
90 95
91 name, ext = os.path.splitext(url) 96 name, ext = os.path.splitext(url)
92 if not ext: 97 if not ext:
93 url += '.md' 98 url += '.md'
94 url = url.lstrip('/') 99 url = url.lstrip('/')
95 return self.withAsset('_content/pages/' + url, text) 100 return self.withAsset('_content/' + url, text)
96 101
97 def withPageAsset(self, page_url, name, contents=None): 102 def withPageAsset(self, page_url, name, contents=None):
98 contents = contents or "A test asset." 103 contents = contents or "A test asset."
99 url_base, ext = os.path.splitext(page_url) 104 url_base, ext = os.path.splitext(page_url)
100 dirname = url_base + '-assets' 105 dirname = url_base + '-assets'
136 def _createMock(self, name, orig, func, **kwargs): 141 def _createMock(self, name, orig, func, **kwargs):
137 self._originals[name] = orig 142 self._originals[name] = orig
138 self._patchers.append(mock.patch(name, func, **kwargs)) 143 self._patchers.append(mock.patch(name, func, **kwargs))
139 144
140 def _open(self, path, *args, **kwargs): 145 def _open(self, path, *args, **kwargs):
141 path = os.path.abspath(path) 146 path = os.path.normpath(path)
142 if path.startswith(resources_path): 147 if path.startswith(resources_path):
143 return self._originals['__main__.open'](path, **kwargs) 148 return self._originals['__main__.open'](path, **kwargs)
144 e = self._getFsEntry(path) 149 e = self._getFsEntry(path)
150 if e is None:
151 raise OSError("No such file: %s" % path)
145 return io.StringIO(e[0]) 152 return io.StringIO(e[0])
146 153
147 def _codecsOpen(self, path, *args, **kwargs): 154 def _codecsOpen(self, path, *args, **kwargs):
148 path = os.path.abspath(path) 155 path = os.path.normpath(path)
149 if path.startswith(resources_path): 156 if path.startswith(resources_path):
150 return self._originals['codecs.open'](path, *args, **kwargs) 157 return self._originals['codecs.open'](path, *args, **kwargs)
151 e = self._getFsEntry(path) 158 e = self._getFsEntry(path)
159 if e is None:
160 raise OSError("No such file: %s" % path)
152 return io.StringIO(e[0]) 161 return io.StringIO(e[0])
153 162
154 def _listdir(self, path): 163 def _listdir(self, path):
155 if not path.startswith('/' + self._root): 164 if not path.startswith('/' + self._root):
156 return self._originals['os.listdir'](path) 165 return self._originals['os.listdir'](path)
157 e = self._getFsEntry(path) 166 e = self._getFsEntry(path)
167 if e is None:
168 raise OSError("No such directory: %s" % path)
158 if not isinstance(e, dict): 169 if not isinstance(e, dict):
159 raise Exception("'%s' is not a directory." % path) 170 raise OSError("'%s' is not a directory." % path)
160 return list(e.keys()) 171 return list(e.keys())
161 172
162 def _isdir(self, path): 173 def _isdir(self, path):
163 if not path.startswith('/' + self._root): 174 if not path.startswith('/' + self._root):
164 return self._originals['os.path.isdir'](path) 175 return self._originals['os.path.isdir'](path)
173 def _getmtime(self, path): 184 def _getmtime(self, path):
174 if not path.startswith('/' + self._root): 185 if not path.startswith('/' + self._root):
175 return self._originals['os.path.getmtime'](path) 186 return self._originals['os.path.getmtime'](path)
176 e = self._getFsEntry(path) 187 e = self._getFsEntry(path)
177 if e is None: 188 if e is None:
178 raise OSError() 189 raise OSError("No such file: %s" % path)
179 return e[1]['mtime'] 190 return e[1]['mtime']
180 191
181 def _getFsEntry(self, path): 192 def _getFsEntry(self, path):
182 cur = self._fs 193 cur = self._fs
183 bits = path.lstrip('/').split('/') 194 path = path.replace('\\', '/').lstrip('/')
195 bits = path.split('/')
184 for p in bits: 196 for p in bits:
185 try: 197 try:
186 cur = cur[p] 198 cur = cur[p]
187 except KeyError: 199 except KeyError:
188 return None 200 return None