A flat-file CMS written in Python and Flask
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.

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. }