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