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.
 
 
 

248 lines
8.6 KiB

  1. # -*- coding: utf-8 -*-
  2. """
  3. Use nose
  4. `$ pip install nose`
  5. `$ nosetests`
  6. """
  7. import yaml
  8. from hyde.fs import File, Folder
  9. from hyde.model import Config, Expando
  10. from hyde.site import Node, RootNode, Site
  11. from nose.tools import raises, with_setup, nottest
  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_relative_path():
  58. s = Site(TEST_SITE_ROOT)
  59. r = RootNode(TEST_SITE_ROOT.child_folder('content'), s)
  60. assert not r.module
  61. n = r.add_node(TEST_SITE_ROOT.child_folder('content/blog'))
  62. assert n.relative_path == 'blog'
  63. c = r.add_node(TEST_SITE_ROOT.child_folder('content/blog/2010/december'))
  64. assert c.relative_path == 'blog/2010/december'
  65. def test_load():
  66. s = Site(TEST_SITE_ROOT)
  67. s.load()
  68. path = 'blog/2010/december'
  69. node = s.content.node_from_relative_path(path)
  70. assert node
  71. assert Folder(node.relative_path) == Folder(path)
  72. path += '/merry-christmas.html'
  73. resource = s.content.resource_from_relative_path(path)
  74. assert resource
  75. assert resource.relative_path == path
  76. assert not s.content.resource_from_relative_path('/happy-festivus.html')
  77. def test_walk_resources():
  78. s = Site(TEST_SITE_ROOT)
  79. s.load()
  80. pages = [page.name for page in s.content.walk_resources()]
  81. expected = ["404.html",
  82. "about.html",
  83. "apple-touch-icon.png",
  84. "merry-christmas.html",
  85. "crossdomain.xml",
  86. "favicon.ico",
  87. "robots.txt",
  88. "site.css"
  89. ]
  90. pages.sort()
  91. expected.sort()
  92. assert pages == expected
  93. def test_contains_resource():
  94. s = Site(TEST_SITE_ROOT)
  95. s.load()
  96. path = 'blog/2010/december'
  97. node = s.content.node_from_relative_path(path)
  98. assert node.contains_resource('merry-christmas.html')
  99. def test_get_resource():
  100. s = Site(TEST_SITE_ROOT)
  101. s.load()
  102. path = 'blog/2010/december'
  103. node = s.content.node_from_relative_path(path)
  104. resource = node.get_resource('merry-christmas.html')
  105. assert resource == s.content.resource_from_relative_path(Folder(path).child('merry-christmas.html'))
  106. def test_resource_slug():
  107. s = Site(TEST_SITE_ROOT)
  108. s.load()
  109. path = 'blog/2010/december'
  110. node = s.content.node_from_relative_path(path)
  111. resource = node.get_resource('merry-christmas.html')
  112. assert resource.slug == 'merry-christmas'
  113. def test_get_resource_from_relative_deploy_path():
  114. s = Site(TEST_SITE_ROOT)
  115. s.load()
  116. path = 'blog/2010/december'
  117. node = s.content.node_from_relative_path(path)
  118. resource = node.get_resource('merry-christmas.html')
  119. assert resource == s.content.resource_from_relative_deploy_path(Folder(path).child('merry-christmas.html'))
  120. resource.relative_deploy_path = Folder(path).child('merry-christmas.php')
  121. assert resource == s.content.resource_from_relative_deploy_path(Folder(path).child('merry-christmas.php'))
  122. def test_is_processable_default_true():
  123. s = Site(TEST_SITE_ROOT)
  124. s.load()
  125. for page in s.content.walk_resources():
  126. assert page.is_processable
  127. def test_relative_deploy_path():
  128. s = Site(TEST_SITE_ROOT)
  129. s.load()
  130. for page in s.content.walk_resources():
  131. assert page.relative_deploy_path == Folder(page.relative_path)
  132. assert page.url == page.relative_deploy_path
  133. def test_relative_deploy_path_override():
  134. s = Site(TEST_SITE_ROOT)
  135. s.load()
  136. res = s.content.resource_from_relative_path('blog/2010/december/merry-christmas.html')
  137. res.relative_deploy_path = 'blog/2010/december/happy-holidays.html'
  138. for page in s.content.walk_resources():
  139. if res.source_file == page.source_file:
  140. assert page.relative_deploy_path == 'blog/2010/december/happy-holidays.html'
  141. else:
  142. assert page.relative_deploy_path == Folder(page.relative_path)
  143. class TestSiteWithConfig(object):
  144. @classmethod
  145. def setup_class(cls):
  146. cls.SITE_PATH = File(__file__).parent.child_folder('sites/test_jinja_with_config')
  147. cls.SITE_PATH.make()
  148. TEST_SITE_ROOT.copy_contents_to(cls.SITE_PATH)
  149. cls.config_file = File(cls.SITE_PATH.child('alternate.yaml'))
  150. with open(cls.config_file.path) as config:
  151. cls.config = Config(sitepath=cls.SITE_PATH, config_dict=yaml.load(config))
  152. cls.SITE_PATH.child_folder('content').rename_to(cls.config.content_root)
  153. @classmethod
  154. def teardown_class(cls):
  155. cls.SITE_PATH.delete()
  156. def test_load_with_config(self):
  157. s = Site(self.SITE_PATH, config=self.config)
  158. s.load()
  159. path = 'blog/2010/december'
  160. node = s.content.node_from_relative_path(path)
  161. assert node
  162. assert Folder(node.relative_path) == Folder(path)
  163. path += '/merry-christmas.html'
  164. resource = s.content.resource_from_relative_path(path)
  165. assert resource
  166. assert resource.relative_path == path
  167. assert not s.content.resource_from_relative_path('/happy-festivus.html')
  168. def test_content_url(self):
  169. s = Site(self.SITE_PATH, config=self.config)
  170. s.load()
  171. path = 'blog/2010/december'
  172. assert s.content_url(path) == "/" + path
  173. def test_media_url(self):
  174. s = Site(self.SITE_PATH, config=self.config)
  175. s.load()
  176. path = 'css/site.css'
  177. assert s.media_url(path) == "/media/" + path
  178. def test_is_media(self):
  179. s = Site(self.SITE_PATH, config=self.config)
  180. s.load()
  181. assert s.is_media('media/css/site.css')
  182. s.config.media_root = 'monkey'
  183. assert not s.is_media('media/css/site.css')
  184. assert s.is_media('monkey/css/site.css')
  185. def test_full_url_for_content(self):
  186. s = Site(self.SITE_PATH, config=self.config)
  187. s.load()
  188. path = 'blog/2010/december'
  189. assert s.full_url(path) == "/" + path
  190. def test_full_url_for_media(self):
  191. s = Site(self.SITE_PATH, config=self.config)
  192. s.load()
  193. path = 'media/css/site.css'
  194. assert s.is_media(path)
  195. full_url = s.full_url(path)
  196. assert full_url == "/" + path
  197. def test_media_url_from_resource(self):
  198. s = Site(self.SITE_PATH, config=self.config)
  199. s.load()
  200. path = 'css/site.css'
  201. resource = s.content.resource_from_relative_path(
  202. Folder("media").child(path))
  203. assert resource
  204. assert resource.full_url == "/media/" + path
  205. def test_config_ignore(self):
  206. s = Site(self.SITE_PATH, config=self.config)
  207. s.load()
  208. path = 'apple-touch-icon.png'
  209. resource = s.content.resource_from_relative_path(path)
  210. assert resource
  211. assert resource.full_url == "/" + path
  212. s = Site(self.SITE_PATH, config=self.config)
  213. s.config.ignore.append('*.png')
  214. resource = s.content.resource_from_relative_path(path)
  215. assert not resource