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

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