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

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