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.6KB

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