/hyde/tests/test_site.py

http://github.com/hyde/hyde · Python · 290 lines · 248 code · 36 blank · 6 comment · 7 complexity · a09a8ce2ebbc86f5e1ae1f62f27d89c3 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. """
  3. Use nose
  4. `$ pip install nose`
  5. `$ nosetests`
  6. """
  7. import yaml
  8. from urllib import quote
  9. from hyde.model import Config
  10. from hyde.site import Node, RootNode, Site
  11. from fswrap import File, Folder
  12. TEST_SITE_ROOT = File(__file__).parent.child_folder('sites/test_jinja')
  13. def test_node_site():
  14. s = Site(TEST_SITE_ROOT)
  15. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  16. assert r.site == s
  17. n = Node(r.source_folder.child_folder('blog'), r)
  18. assert n.site == s
  19. def test_node_root():
  20. s = Site(TEST_SITE_ROOT)
  21. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  22. assert r.root == r
  23. n = Node(r.source_folder.child_folder('blog'), r)
  24. assert n.root == r
  25. def test_node_parent():
  26. s = Site(TEST_SITE_ROOT)
  27. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  28. c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december'))
  29. assert c.parent == r.node_from_relative_path('blog/2010')
  30. def test_node_module():
  31. s = Site(TEST_SITE_ROOT)
  32. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  33. assert not r.module
  34. n = r.add_node(TEST_SITE_ROOT.child_folder('content/blog'))
  35. assert n.module == n
  36. c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december'))
  37. assert c.module == n
  38. def test_node_url():
  39. s = Site(TEST_SITE_ROOT)
  40. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  41. assert not r.module
  42. n = r.add_node(TEST_SITE_ROOT.child_folder('content/blog'))
  43. assert n.url == '/' + n.relative_path
  44. assert n.url == '/blog'
  45. c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december'))
  46. assert c.url == '/' + c.relative_path
  47. assert c.url == '/blog/2010/december'
  48. def test_node_full_url():
  49. s = Site(TEST_SITE_ROOT)
  50. s.config.base_url = 'http://localhost'
  51. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  52. assert not r.module
  53. n = r.add_node(TEST_SITE_ROOT.child_folder('content/blog'))
  54. assert n.full_url == 'http://localhost/blog'
  55. c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december'))
  56. assert c.full_url == 'http://localhost/blog/2010/december'
  57. def test_node_full_url_quoted():
  58. s = Site(TEST_SITE_ROOT)
  59. s.config.base_url = 'http://localhost'
  60. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  61. assert not r.module
  62. n = r.add_node(TEST_SITE_ROOT.child_folder('content/blo~g'))
  63. assert n.full_url == 'http://localhost/' + quote('blo~g')
  64. c = r.add_node(TEST_SITE_ROOT.child_folder('content/blo~g/2010/december'))
  65. assert c.full_url == 'http://localhost/' + quote('blo~g/2010/december')
  66. def test_node_relative_path():
  67. s = Site(TEST_SITE_ROOT)
  68. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  69. assert not r.module
  70. n = r.add_node(TEST_SITE_ROOT.child_folder('content/blog'))
  71. assert n.relative_path == 'blog'
  72. c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december'))
  73. assert c.relative_path == 'blog/2010/december'
  74. def test_load():
  75. s = Site(TEST_SITE_ROOT)
  76. s.load()
  77. path = 'blog/2010/december'
  78. node = s.content.node_from_relative_path(path)
  79. assert node
  80. assert Folder(node.relative_path) == Folder(path)
  81. path += '/merry-christmas.html'
  82. resource = s.content.resource_from_relative_path(path)
  83. assert resource
  84. assert resource.relative_path == path
  85. assert not s.content.resource_from_relative_path('/happy-festivus.html')
  86. def test_walk_resources():
  87. s = Site(TEST_SITE_ROOT)
  88. s.load()
  89. pages = [page.name for page in s.content.walk_resources()]
  90. expected = ["404.html",
  91. "about.html",
  92. "apple-touch-icon.png",
  93. "merry-christmas.html",
  94. "crossdomain.xml",
  95. "favicon.ico",
  96. "robots.txt",
  97. "site.css"
  98. ]
  99. pages.sort()
  100. expected.sort()
  101. assert pages == expected
  102. def test_contains_resource():
  103. s = Site(TEST_SITE_ROOT)
  104. s.load()
  105. path = 'blog/2010/december'
  106. node = s.content.node_from_relative_path(path)
  107. assert node.contains_resource('merry-christmas.html')
  108. def test_get_resource():
  109. s = Site(TEST_SITE_ROOT)
  110. s.load()
  111. path = 'blog/2010/december'
  112. node = s.content.node_from_relative_path(path)
  113. resource = node.get_resource('merry-christmas.html')
  114. assert resource == s.content.resource_from_relative_path(Folder(path).child('merry-christmas.html'))
  115. def test_resource_slug():
  116. s = Site(TEST_SITE_ROOT)
  117. s.load()
  118. path = 'blog/2010/december'
  119. node = s.content.node_from_relative_path(path)
  120. resource = node.get_resource('merry-christmas.html')
  121. assert resource.slug == 'merry-christmas'
  122. def test_get_resource_from_relative_deploy_path():
  123. s = Site(TEST_SITE_ROOT)
  124. s.load()
  125. path = 'blog/2010/december'
  126. node = s.content.node_from_relative_path(path)
  127. resource = node.get_resource('merry-christmas.html')
  128. assert resource == s.content.resource_from_relative_deploy_path(Folder(path).child('merry-christmas.html'))
  129. resource.relative_deploy_path = Folder(path).child('merry-christmas.php')
  130. assert resource == s.content.resource_from_relative_deploy_path(Folder(path).child('merry-christmas.php'))
  131. def test_is_processable_default_true():
  132. s = Site(TEST_SITE_ROOT)
  133. s.load()
  134. for page in s.content.walk_resources():
  135. assert page.is_processable
  136. def test_relative_deploy_path():
  137. s = Site(TEST_SITE_ROOT)
  138. s.load()
  139. for page in s.content.walk_resources():
  140. assert page.relative_deploy_path == Folder(page.relative_path)
  141. assert page.url == '/' + page.relative_deploy_path
  142. def test_relative_deploy_path_override():
  143. s = Site(TEST_SITE_ROOT)
  144. s.load()
  145. res = s.content.resource_from_relative_path('blog/2010/december/merry-christmas.html')
  146. res.relative_deploy_path = 'blog/2010/december/happy-holidays.html'
  147. for page in s.content.walk_resources():
  148. if res.source_file == page.source_file:
  149. assert page.relative_deploy_path == 'blog/2010/december/happy-holidays.html'
  150. else:
  151. assert page.relative_deploy_path == Folder(page.relative_path)
  152. class TestSiteWithConfig(object):
  153. @classmethod
  154. def setup_class(cls):
  155. cls.SITE_PATH = File(__file__).parent.child_folder('sites/test_jinja_with_config')
  156. cls.SITE_PATH.make()
  157. TEST_SITE_ROOT.copy_contents_to(cls.SITE_PATH)
  158. cls.config_file = File(cls.SITE_PATH.child('alternate.yaml'))
  159. with open(cls.config_file.path) as config:
  160. cls.config = Config(sitepath=cls.SITE_PATH, config_dict=yaml.load(config))
  161. cls.SITE_PATH.child_folder('content').rename_to(cls.config.content_root)
  162. @classmethod
  163. def teardown_class(cls):
  164. cls.SITE_PATH.delete()
  165. def test_load_with_config(self):
  166. s = Site(self.SITE_PATH, config=self.config)
  167. s.load()
  168. path = 'blog/2010/december'
  169. node = s.content.node_from_relative_path(path)
  170. assert node
  171. assert Folder(node.relative_path) == Folder(path)
  172. path += '/merry-christmas.html'
  173. resource = s.content.resource_from_relative_path(path)
  174. assert resource
  175. assert resource.relative_path == path
  176. assert not s.content.resource_from_relative_path('/happy-festivus.html')
  177. def test_content_url(self):
  178. s = Site(self.SITE_PATH, config=self.config)
  179. s.load()
  180. path = 'blog/2010/december'
  181. assert s.content_url(path) == "/" + path
  182. def test_content_url_encoding(self):
  183. s = Site(self.SITE_PATH, config=self.config)
  184. s.load()
  185. path = '".jpg'
  186. assert s.content_url(path) == "/" + quote(path)
  187. def test_content_url_encoding_safe(self):
  188. s = Site(self.SITE_PATH, config=self.config)
  189. s.load()
  190. path = '".jpg/abc'
  191. print s.content_url(path, "")
  192. print "/" + quote(path, "")
  193. assert s.content_url(path, "") == "/" + quote(path, "")
  194. def test_media_url(self):
  195. s = Site(self.SITE_PATH, config=self.config)
  196. s.load()
  197. path = 'css/site.css'
  198. assert s.media_url(path) == "/media/" + path
  199. def test_is_media(self):
  200. s = Site(self.SITE_PATH, config=self.config)
  201. s.load()
  202. assert s.is_media('media/css/site.css')
  203. s.config.media_root = 'monkey'
  204. assert not s.is_media('media/css/site.css')
  205. assert s.is_media('monkey/css/site.css')
  206. def test_full_url_for_content(self):
  207. s = Site(self.SITE_PATH, config=self.config)
  208. s.load()
  209. path = 'blog/2010/december'
  210. assert s.full_url(path) == "/" + path
  211. def test_full_url_for_media(self):
  212. s = Site(self.SITE_PATH, config=self.config)
  213. s.load()
  214. path = 'media/css/site.css'
  215. assert s.is_media(path)
  216. full_url = s.full_url(path)
  217. assert full_url == "/" + path
  218. def test_media_url_from_resource(self):
  219. s = Site(self.SITE_PATH, config=self.config)
  220. s.load()
  221. path = 'css/site.css'
  222. resource = s.content.resource_from_relative_path(
  223. Folder("media").child(path))
  224. assert resource
  225. assert resource.full_url == "/media/" + path
  226. def test_config_ignore(self):
  227. c = Config(self.SITE_PATH, config_dict=self.config.to_dict())
  228. s = Site(self.SITE_PATH, config=c)
  229. s.load()
  230. path = 'apple-touch-icon.png'
  231. resource = s.content.resource_from_relative_path(path)
  232. assert resource
  233. assert resource.full_url == "/" + path
  234. s = Site(self.SITE_PATH, config=c)
  235. s.config.ignore.append('*.png')
  236. resource = s.content.resource_from_relative_path(path)
  237. assert not resource
  238. def test_config_ignore_nodes(self):
  239. c = Config(self.SITE_PATH, config_dict=self.config.to_dict())
  240. git = self.SITE_PATH.child_folder('.git')
  241. git.make()
  242. s = Site(self.SITE_PATH, config=c)
  243. s.load()
  244. git_node = s.content.node_from_relative_path('.git')
  245. assert not git_node
  246. blog_node = s.content.node_from_relative_path('blog')
  247. assert blog_node
  248. assert blog_node.full_url == "/blog"
  249. s = Site(self.SITE_PATH, config=c)
  250. s.config.ignore.append('blog')
  251. blog_node = s.content.node_from_relative_path('blog')
  252. assert not blog_node
  253. git_node = s.content.node_from_relative_path('.git')
  254. assert not git_node