A fork of hyde, the static site generation. Some patches will be pushed upstream.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

457 lines
12 KiB

  1. # -*- coding: utf-8 -*-
  2. """
  3. Use nose
  4. `$ pip install nose`
  5. `$ nosetests`
  6. """
  7. from hyde.fs import FS, File, Folder
  8. import codecs
  9. import os
  10. import shutil
  11. from nose.tools import raises, with_setup, nottest
  12. def test_representation():
  13. f = FS(__file__)
  14. assert f.path == __file__
  15. assert unicode(f) == __file__
  16. assert repr(f) == __file__
  17. def test_name():
  18. f = FS(__file__)
  19. assert f.name == os.path.basename(__file__)
  20. def test_equals():
  21. f = FS('/blog/2010/december')
  22. g = FS('/blog/2010/december')
  23. h = FS('/blog/2010/december/')
  24. i = FS('/blog/2010/november')
  25. assert f == f.path
  26. assert f == g
  27. assert f == h
  28. assert f != i
  29. def test_name_without_extension():
  30. f = File(__file__)
  31. assert f.name_without_extension == "test_fs"
  32. def test_extension():
  33. f = File(__file__)
  34. assert f.extension == os.path.splitext(__file__)[1]
  35. f = File("abc")
  36. assert f.extension == ''
  37. def test_kind():
  38. f = File(__file__)
  39. assert f.kind == os.path.splitext(__file__)[1].lstrip('.')
  40. f = File("abc")
  41. assert f.kind == ''
  42. def test_can_create_temp_file():
  43. text = "A for apple"
  44. f = File.make_temp(text)
  45. assert f.exists
  46. assert text == f.read_all()
  47. f.delete()
  48. assert not f.exists
  49. def test_time_functions():
  50. f1 = File(__file__)
  51. t1 = f1.last_modified
  52. f2 = File.make_temp("I am new")
  53. t2 = f2.last_modified
  54. assert t1 < t2
  55. assert f2.has_changed_since(t1)
  56. assert f1.older_than(f2)
  57. def test_path_expands_user():
  58. f = File("~/abc/def")
  59. assert f.path == os.path.expanduser("~/abc/def")
  60. def test_fully_expanded_path():
  61. f = File(__file__).parent
  62. n = f.child_folder('../' + f.name)
  63. e = Folder(n.fully_expanded_path)
  64. assert n != e
  65. assert f == e
  66. def test_parent():
  67. f = File(__file__)
  68. p = f.parent
  69. assert hasattr(p, 'child_folder')
  70. assert unicode(p) == os.path.dirname(__file__)
  71. def test_child():
  72. p = File(__file__).parent
  73. c = p.child('data.dat')
  74. assert c == os.path.join(os.path.dirname(__file__), 'data.dat')
  75. def test_child_folder():
  76. p = File(__file__).parent
  77. c = p.child_folder('data')
  78. assert hasattr(c, 'child_folder')
  79. assert unicode(c) == os.path.join(os.path.dirname(__file__), 'data')
  80. def test_exists():
  81. p = FS(__file__)
  82. assert p.exists
  83. p = FS(__file__ + "_some_junk")
  84. assert not p.exists
  85. f = FS(__file__).parent.parent
  86. assert f.exists
  87. f = FS(__file__).parent.child_folder('templates')
  88. assert f.exists
  89. def test_create_folder():
  90. f = FS(__file__).parent
  91. assert f.exists
  92. f.make()
  93. assert True # No Exceptions
  94. c = f.child_folder('__test__')
  95. assert not c.exists
  96. c.make()
  97. assert c.exists
  98. shutil.rmtree(unicode(c))
  99. assert not c.exists
  100. def test_remove_folder():
  101. f = FS(__file__).parent
  102. c = f.child_folder('__test__')
  103. assert not c.exists
  104. c.make()
  105. assert c.exists
  106. c.delete()
  107. assert not c.exists
  108. def test_can_remove_file():
  109. f = FS(__file__).parent
  110. c = f.child_folder('__test__')
  111. c.make()
  112. assert c.exists
  113. txt = "abc"
  114. abc = File(c.child('abc.txt'))
  115. abc.write(txt)
  116. assert abc.exists
  117. abc.delete()
  118. assert not abc.exists
  119. abc.delete()
  120. assert True # No Exception
  121. c.delete()
  122. def test_file_or_folder():
  123. f = FS.file_or_folder(__file__)
  124. assert isinstance(f, File)
  125. f = FS.file_or_folder(File(__file__).parent)
  126. assert isinstance(f, Folder)
  127. DATA_ROOT = File(__file__).parent.child_folder('data')
  128. TEMPLATE_ROOT = File(__file__).parent.child_folder('templates')
  129. JINJA2 = TEMPLATE_ROOT.child_folder('jinja2')
  130. HELPERS = File(JINJA2.child('helpers.html'))
  131. INDEX = File(JINJA2.child('index.html'))
  132. LAYOUT = File(JINJA2.child('layout.html'))
  133. LOGO = File(TEMPLATE_ROOT.child('../../../resources/hyde-logo.png'))
  134. XML = File(TEMPLATE_ROOT.child('../sites/test_jinja/content/crossdomain.xml'))
  135. def test_ancestors():
  136. depth = 0
  137. next = JINJA2
  138. for folder in INDEX.ancestors():
  139. assert folder == next
  140. depth += 1
  141. next = folder.parent
  142. assert depth == len(JINJA2.path.split(os.sep))
  143. def test_ancestors_stop():
  144. depth = 0
  145. next = JINJA2
  146. for folder in INDEX.ancestors(stop=TEMPLATE_ROOT.parent):
  147. assert folder == next
  148. depth += 1
  149. next = folder.parent
  150. assert depth == 2
  151. def test_is_descendant_of():
  152. assert INDEX.is_descendant_of(JINJA2)
  153. assert JINJA2.is_descendant_of(TEMPLATE_ROOT)
  154. assert INDEX.is_descendant_of(TEMPLATE_ROOT)
  155. assert not INDEX.is_descendant_of(DATA_ROOT)
  156. def test_get_relative_path():
  157. assert INDEX.get_relative_path(TEMPLATE_ROOT) == Folder(JINJA2.name).child(INDEX.name)
  158. assert INDEX.get_relative_path(TEMPLATE_ROOT.parent) == Folder(
  159. TEMPLATE_ROOT.name).child_folder(JINJA2.name).child(INDEX.name)
  160. assert JINJA2.get_relative_path(JINJA2) == ""
  161. def test_get_mirror():
  162. mirror = JINJA2.get_mirror(DATA_ROOT, source_root=TEMPLATE_ROOT)
  163. assert mirror == DATA_ROOT.child_folder(JINJA2.name)
  164. mirror = JINJA2.get_mirror(DATA_ROOT, source_root=TEMPLATE_ROOT.parent)
  165. assert mirror == DATA_ROOT.child_folder(TEMPLATE_ROOT.name).child_folder(JINJA2.name)
  166. def test_mimetype():
  167. assert HELPERS.mimetype == 'text/html'
  168. assert LOGO.mimetype == 'image/png'
  169. def test_is_text():
  170. assert HELPERS.is_text
  171. assert not LOGO.is_text
  172. assert XML.is_text
  173. def test_is_image():
  174. assert not HELPERS.is_image
  175. assert LOGO.is_image
  176. def test_file_size():
  177. assert LOGO.size == 1942
  178. @nottest
  179. def setup_data():
  180. DATA_ROOT.make()
  181. @nottest
  182. def cleanup_data():
  183. DATA_ROOT.delete()
  184. @with_setup(setup_data, cleanup_data)
  185. def test_copy_file():
  186. DATA_HELPERS = File(DATA_ROOT.child(HELPERS.name))
  187. assert not DATA_HELPERS.exists
  188. HELPERS.copy_to(DATA_ROOT)
  189. assert DATA_HELPERS.exists
  190. @with_setup(setup_data, cleanup_data)
  191. def test_copy_folder():
  192. assert DATA_ROOT.exists
  193. DATA_JINJA2 = DATA_ROOT.child_folder(JINJA2.name)
  194. assert not DATA_JINJA2.exists
  195. JINJA2.copy_to(DATA_ROOT)
  196. assert DATA_JINJA2.exists
  197. for f in [HELPERS, INDEX, LAYOUT]:
  198. assert File(DATA_JINJA2.child(f.name)).exists
  199. @with_setup(setup_data, cleanup_data)
  200. def test_copy_folder_target_missing():
  201. DATA_ROOT.delete()
  202. assert not DATA_ROOT.exists
  203. DATA_JINJA2 = DATA_ROOT.child_folder(JINJA2.name)
  204. assert not DATA_JINJA2.exists
  205. JINJA2.copy_to(DATA_ROOT)
  206. assert DATA_JINJA2.exists
  207. for f in [HELPERS, INDEX, LAYOUT]:
  208. assert File(DATA_JINJA2.child(f.name)).exists
  209. @with_setup(setup_data, cleanup_data)
  210. def test_copy_folder_contents():
  211. for f in [HELPERS, INDEX, LAYOUT]:
  212. assert not File(DATA_ROOT.child(f.name)).exists
  213. JINJA2.copy_contents_to(DATA_ROOT)
  214. for f in [HELPERS, INDEX, LAYOUT]:
  215. assert File(DATA_ROOT.child(f.name)).exists
  216. @with_setup(setup_data, cleanup_data)
  217. def test_move_folder():
  218. DATA_JUNK = DATA_ROOT.child_folder('junk')
  219. assert not DATA_JUNK.exists
  220. JINJA2.copy_contents_to(DATA_JUNK)
  221. assert DATA_JUNK.exists
  222. for f in [HELPERS, INDEX, LAYOUT]:
  223. assert File(DATA_JUNK.child(f.name)).exists
  224. DATA_JUNK2 = DATA_ROOT.child_folder('second_junk')
  225. assert not DATA_JUNK2.exists
  226. DATA_JUNK.move_to(DATA_JUNK2)
  227. assert not DATA_JUNK.exists
  228. assert DATA_JUNK2.exists
  229. for f in [HELPERS, INDEX, LAYOUT]:
  230. assert File(DATA_JUNK2.child_folder(
  231. DATA_JUNK.name).child(
  232. f.name)).exists
  233. @with_setup(setup_data, cleanup_data)
  234. def test_rename_folder():
  235. DATA_JUNK = DATA_ROOT.child_folder('junk')
  236. assert not DATA_JUNK.exists
  237. JINJA2.copy_contents_to(DATA_JUNK)
  238. for f in [HELPERS, INDEX, LAYOUT]:
  239. assert File(DATA_JUNK.child(f.name)).exists
  240. DATA_JUNK2 = DATA_ROOT.child_folder('junk2')
  241. assert DATA_JUNK.exists
  242. assert not DATA_JUNK2.exists
  243. DATA_JUNK.rename_to('junk2')
  244. assert not DATA_JUNK.exists
  245. assert DATA_JUNK2.exists
  246. for f in [HELPERS, INDEX, LAYOUT]:
  247. assert File(DATA_JUNK2.child(f.name)).exists
  248. @with_setup(setup_data, cleanup_data)
  249. def test_read_all():
  250. utxt = u'åßcdeƒ'
  251. path = DATA_ROOT.child('unicode.txt')
  252. with codecs.open(path, 'w', 'utf-8') as f:
  253. f.write(utxt)
  254. txt = File(path).read_all()
  255. assert txt == utxt
  256. @with_setup(setup_data, cleanup_data)
  257. def test_write():
  258. utxt = u'åßcdeƒ'
  259. path = DATA_ROOT.child('unicode.txt')
  260. File(path).write(utxt)
  261. txt = File(path).read_all()
  262. assert txt == utxt
  263. def test_walker():
  264. folders = []
  265. files = []
  266. complete = []
  267. with TEMPLATE_ROOT.walker as walker:
  268. @walker.folder_visitor
  269. def visit_folder(f):
  270. folders.append(f)
  271. @walker.file_visitor
  272. def visit_file(f):
  273. files.append(f)
  274. @walker.finalizer
  275. def visit_complete():
  276. assert folders[0] == TEMPLATE_ROOT
  277. assert folders[1] == JINJA2
  278. assert INDEX in files
  279. assert HELPERS in files
  280. assert LAYOUT in files
  281. complete.append(True)
  282. assert len(files) == 4
  283. assert len(folders) == 2
  284. assert len(complete) == 1
  285. def test_walker_walk_all():
  286. items = list(TEMPLATE_ROOT.walker.walk_all())
  287. assert len(items) == 6
  288. assert TEMPLATE_ROOT in items
  289. assert JINJA2 in items
  290. assert INDEX in items
  291. assert HELPERS in items
  292. assert LAYOUT in items
  293. def test_walker_walk_files():
  294. items = list(TEMPLATE_ROOT.walker.walk_files())
  295. assert len(items) == 4
  296. assert INDEX in items
  297. assert HELPERS in items
  298. assert LAYOUT in items
  299. def test_walker_walk_folders():
  300. items = list(TEMPLATE_ROOT.walker.walk_folders())
  301. assert len(items) == 2
  302. assert TEMPLATE_ROOT in items
  303. assert JINJA2 in items
  304. def test_walker_templates_just_root():
  305. folders = []
  306. files = []
  307. complete = []
  308. with TEMPLATE_ROOT.walker as walker:
  309. @walker.folder_visitor
  310. def visit_folder(f):
  311. assert f == TEMPLATE_ROOT
  312. folders.append(f)
  313. return False
  314. @walker.file_visitor
  315. def visit_file(f):
  316. files.append(f)
  317. @walker.finalizer
  318. def visit_complete():
  319. complete.append(True)
  320. assert len(files) == 0
  321. assert len(folders) == 1
  322. assert len(complete) == 1
  323. def test_lister_templates():
  324. folders = []
  325. files = []
  326. complete = []
  327. with TEMPLATE_ROOT.lister as lister:
  328. @lister.folder_visitor
  329. def visit_folder(f):
  330. assert f == JINJA2
  331. folders.append(f)
  332. @lister.file_visitor
  333. def visit_file(f):
  334. files.append(f)
  335. @lister.finalizer
  336. def visit_complete():
  337. complete.append(True)
  338. assert len(files) == 0
  339. assert len(folders) == 1
  340. assert len(complete) == 1
  341. def test_lister_list_all():
  342. items = list(TEMPLATE_ROOT.lister.list_all())
  343. assert len(items) == 1
  344. assert JINJA2 in items
  345. items = list(JINJA2.lister.list_all())
  346. assert len(items) == 4
  347. assert INDEX in items
  348. assert HELPERS in items
  349. assert LAYOUT in items
  350. def test_lister_list_files():
  351. items = list(TEMPLATE_ROOT.lister.list_files())
  352. assert len(items) == 0
  353. items = list(JINJA2.lister.list_files())
  354. assert len(items) == 4
  355. assert INDEX in items
  356. assert HELPERS in items
  357. assert LAYOUT in items
  358. def test_lister_list_folders():
  359. items = list(TEMPLATE_ROOT.lister.list_folders())
  360. assert len(items) == 1
  361. assert JINJA2 in items
  362. items = list(JINJA2.lister.list_folders())
  363. assert len(items) == 0
  364. def test_lister_jinja2():
  365. folders = []
  366. files = []
  367. complete = []
  368. with JINJA2.lister as lister:
  369. @lister.folder_visitor
  370. def visit_folder(f):
  371. folders.append(f)
  372. @lister.file_visitor
  373. def visit_file(f):
  374. files.append(f)
  375. @lister.finalizer
  376. def visit_complete():
  377. assert INDEX in files
  378. assert HELPERS in files
  379. assert LAYOUT in files
  380. complete.append(True)
  381. assert len(files) == 4
  382. assert len(folders) == 0
  383. assert len(complete) == 1