A flat-file CMS written in Python and Flask
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

test_posts.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import datetime
  2. import json
  3. import os
  4. import tempfile
  5. from yird.settings import Settings
  6. def setup():
  7. # Tears down automatically when variable goes out of scope
  8. temp_dir = tempfile.TemporaryDirectory()
  9. os.environ["YIRD_PATH"] = temp_dir.name
  10. os.mkdir(os.path.join(temp_dir.name, 'posts'))
  11. os.mkdir(os.path.join(temp_dir.name, 'templates'))
  12. os.mkdir(os.path.join(temp_dir.name, 'public'))
  13. with open(os.path.join(temp_dir.name, 'settings.json'), "w") as f:
  14. f.write(json.dumps({
  15. "PUBLIC_PATH": os.path.join(temp_dir.name, 'public'),
  16. "SITE_NAME": "test website",
  17. "MARKDOWN_PREVIEW": True
  18. }))
  19. # Importing PostsService initializes a Settings object which depends on
  20. # YIRD_PATH already being set, and needs to be reinitialized between tests,
  21. # so we're doing all that explicitly in the setup
  22. from yird.services.posts import PostsService
  23. PostsService.settings = Settings()
  24. return temp_dir, PostsService
  25. def test_create_post():
  26. # Setup
  27. root, PostsService = setup()
  28. # Create a post
  29. post = PostsService.create_post({
  30. "title": "Test Post",
  31. "slug": "test-post",
  32. "date": "2000-01-01",
  33. "content": "# Lorem ipsum dolor sit amet"
  34. })
  35. # Read metadata and contents files
  36. with open(os.path.join(root.name, 'posts', post.id + '.json')) as f:
  37. metadata = json.loads(f.read())
  38. with open(os.path.join(root.name, 'posts', post.id + '.md')) as f:
  39. content = f.read()
  40. # Assert metadata
  41. assert metadata == {
  42. "id": post.id,
  43. "title": "Test Post",
  44. "slug": "test-post",
  45. "date": "2000-01-01",
  46. "changed": True
  47. }
  48. # Assert content
  49. assert content == "# Lorem ipsum dolor sit amet"
  50. def test_get_post():
  51. _root, PostsService = setup()
  52. # Create a post
  53. post = PostsService.create_post({
  54. "title": "Test Post",
  55. "slug": "test-post",
  56. "date": "2000-01-01",
  57. "content": "# Lorem ipsum dolor sit amet"
  58. })
  59. # Get the post
  60. post = PostsService.get_post(post.id)
  61. # Assert post data
  62. assert post.title == "Test Post"
  63. assert post.slug == "test-post"
  64. assert post.date == datetime.date.fromisoformat("2000-01-01")
  65. assert post.content == "# Lorem ipsum dolor sit amet"
  66. def test_get_posts():
  67. _root, PostsService = setup()
  68. # Create a couple of posts
  69. post1 = PostsService.create_post({
  70. "title": "Test Post 1",
  71. "slug": "test-post-1",
  72. "date": "2000-01-01",
  73. "content": "# Lorem ipsum dolor sit amet"
  74. })
  75. post2 = PostsService.create_post({
  76. "title": "Test Post 2",
  77. "slug": "test-post-2",
  78. "date": "2000-01-02",
  79. "content": "# Lorem ipsum dolor sit amet"
  80. })
  81. # Get the post and sort by title
  82. posts = PostsService.get_posts()
  83. posts = sorted(posts, key=lambda post: post.title)
  84. # Assert the post data
  85. assert posts[0].id == post1.id
  86. assert posts[0].title == "Test Post 1"
  87. assert posts[0].slug == "test-post-1"
  88. assert posts[0].date == datetime.date.fromisoformat("2000-01-01")
  89. assert posts[0].content == "# Lorem ipsum dolor sit amet"
  90. assert posts[1].id == post2.id
  91. assert posts[1].title == "Test Post 2"
  92. assert posts[1].slug == "test-post-2"
  93. assert posts[1].date == datetime.date.fromisoformat("2000-01-02")
  94. assert posts[1].content == "# Lorem ipsum dolor sit amet"
  95. def test_generate_posts():
  96. root, PostsService = setup()
  97. # Create post template
  98. with open(os.path.join(root.name, 'templates', 'post.html'), "w") as f:
  99. f.write('''
  100. <div><h1>{{ post.title }}</h1><div>{{ post.content }}</div></div>
  101. ''')
  102. # Create post
  103. post = PostsService.create_post({
  104. "title": "Test Post",
  105. "slug": "test-post",
  106. "date": "2000-01-01",
  107. "content": "# Lorem ipsum dolor sit amet"
  108. })
  109. # Generate post
  110. PostsService.generate_posts()
  111. # Assert generated HTML
  112. with open(os.path.join(root.name, 'public', post.id, 'index.html')) as f:
  113. contents = f.read()
  114. assert contents == '''
  115. <div><h1>Test Post</h1><div><h1>Lorem ipsum dolor sit amet</h1></div></div>
  116. '''
  117. # Assert that generating the post marks the post unchanged
  118. with open(os.path.join(root.name, 'posts', post.id + '.json')) as f:
  119. metadata = json.loads(f.read())
  120. assert metadata["changed"] is False
  121. def test_update_post():
  122. _root, PostsService = setup()
  123. # Create post
  124. post = PostsService.create_post({
  125. "title": "Test Post",
  126. "slug": "test-post",
  127. "date": "2000-01-01",
  128. "content": "# Lorem ipsum dolor sit amet"
  129. })
  130. # Update post
  131. PostsService.update_post(post.id, {
  132. "id": post.id,
  133. "title": "Edited Title",
  134. "slug": "edited-slug",
  135. "date": "2000-01-01",
  136. "content": "# Lorem ipsum dolor sit amet",
  137. })
  138. # Load metadata
  139. metadata = post.load_metadata()
  140. # Assert that the title and slug changed
  141. assert metadata["title"] == "Edited Title"
  142. assert metadata["slug"] == "edited-slug"
  143. def test_get_post_form():
  144. _root, PostsService = setup()
  145. form = PostsService.get_post_form()
  146. assert form.data == {
  147. "title": None,
  148. "slug": None,
  149. "date": datetime.date.today(),
  150. "content": None
  151. }
  152. post = PostsService.create_post({
  153. "title": "Test Post",
  154. "slug": "test-post",
  155. "date": "2000-01-01",
  156. "content": "# Lorem ipsum dolor sit amet"
  157. })
  158. form = PostsService.get_post_form(post)
  159. assert form.data == {
  160. "title": "Test Post",
  161. "slug": "test-post",
  162. "date": datetime.date.fromisoformat("2000-01-01"),
  163. "content": "# Lorem ipsum dolor sit amet"
  164. }