123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- import datetime
- import json
- import os
- import tempfile
-
- from yird.settings import Settings
-
-
- def setup():
- # Tears down automatically when variable goes out of scope
- temp_dir = tempfile.TemporaryDirectory()
-
- os.environ["YIRD_PATH"] = temp_dir.name
- os.mkdir(os.path.join(temp_dir.name, 'posts'))
- os.mkdir(os.path.join(temp_dir.name, 'templates'))
- os.mkdir(os.path.join(temp_dir.name, 'public'))
- with open(os.path.join(temp_dir.name, 'settings.json'), "w") as f:
- f.write(json.dumps({
- "PUBLIC_PATH": os.path.join(temp_dir.name, 'public')
- }))
-
- # Importing PostsService initializes a Settings object which depends on
- # YIRD_PATH already being set, and needs to be reinitialized between tests,
- # so we're doing all that explicitly in the setup
- from yird.services.posts import PostsService
- PostsService.settings = Settings()
-
- return temp_dir, PostsService
-
-
- def test_create_post():
- # Setup
- root, PostsService = setup()
-
- # Create a post
- post = PostsService.create_post({
- "title": "Test Post",
- "slug": "test-post",
- "date": "2000-01-01",
- "content": "# Lorem ipsum dolor sit amet"
- })
-
- # Read metadata and contents files
- with open(os.path.join(root.name, 'posts', post.id + '.json')) as f:
- metadata = json.loads(f.read())
- with open(os.path.join(root.name, 'posts', post.id + '.md')) as f:
- content = f.read()
-
- # Assert metadata
- assert metadata == {
- "id": post.id,
- "title": "Test Post",
- "slug": "test-post",
- "date": "2000-01-01",
- "changed": True
- }
-
- # Assert content
- assert content == "# Lorem ipsum dolor sit amet"
-
-
- def test_get_post():
- _root, PostsService = setup()
-
- # Create a post
- post = PostsService.create_post({
- "title": "Test Post",
- "slug": "test-post",
- "date": "2000-01-01",
- "content": "# Lorem ipsum dolor sit amet"
- })
-
- # Get the post
- post = PostsService.get_post(post.id)
-
- # Assert post data
- assert post.title == "Test Post"
- assert post.slug == "test-post"
- assert post.date == datetime.date.fromisoformat("2000-01-01")
- assert post.content == "# Lorem ipsum dolor sit amet"
-
-
- def test_get_posts():
- _root, PostsService = setup()
-
- # Create a couple of posts
- post1 = PostsService.create_post({
- "title": "Test Post 1",
- "slug": "test-post-1",
- "date": "2000-01-01",
- "content": "# Lorem ipsum dolor sit amet"
- })
- post2 = PostsService.create_post({
- "title": "Test Post 2",
- "slug": "test-post-2",
- "date": "2000-01-02",
- "content": "# Lorem ipsum dolor sit amet"
- })
-
- # Get the post and sort by title
- posts = PostsService.get_posts()
- posts = sorted(posts, key=lambda post: post.title)
-
- # Assert the post data
- assert posts[0].id == post1.id
- assert posts[0].title == "Test Post 1"
- assert posts[0].slug == "test-post-1"
- assert posts[0].date == datetime.date.fromisoformat("2000-01-01")
- assert posts[0].content == "# Lorem ipsum dolor sit amet"
- assert posts[1].id == post2.id
- assert posts[1].title == "Test Post 2"
- assert posts[1].slug == "test-post-2"
- assert posts[1].date == datetime.date.fromisoformat("2000-01-02")
- assert posts[1].content == "# Lorem ipsum dolor sit amet"
-
-
- def test_generate_posts():
- root, PostsService = setup()
-
- # Create post template
- with open(os.path.join(root.name, 'templates', 'post.html'), "w") as f:
- f.write('''
- <div><h1>{{ post.title }}</h1><div>{{ post.content }}</div></div>
- ''')
-
- # Create post
- post = PostsService.create_post({
- "title": "Test Post",
- "slug": "test-post",
- "date": "2000-01-01",
- "content": "# Lorem ipsum dolor sit amet"
- })
-
- # Generate post
- PostsService.generate_posts()
-
- # Assert generated HTML
- with open(os.path.join(root.name, 'public', post.id, 'index.html')) as f:
- contents = f.read()
- assert contents == '''
- <div><h1>Test Post</h1><div><h1>Lorem ipsum dolor sit amet</h1></div></div>
- '''
-
- # Assert that generating the post marks the post unchanged
- with open(os.path.join(root.name, 'posts', post.id + '.json')) as f:
- metadata = json.loads(f.read())
- assert metadata["changed"] is False
-
-
- def test_update_post():
- _root, PostsService = setup()
-
- # Create post
- post = PostsService.create_post({
- "title": "Test Post",
- "slug": "test-post",
- "date": "2000-01-01",
- "content": "# Lorem ipsum dolor sit amet"
- })
-
- # Update post
- PostsService.update_post(post.id, {
- "id": post.id,
- "title": "Edited Title",
- "slug": "edited-slug",
- "date": "2000-01-01",
- "content": "# Lorem ipsum dolor sit amet",
- })
-
- # Load metadata
- metadata = post.load_metadata()
-
- # Assert that the title and slug changed
- assert metadata["title"] == "Edited Title"
- assert metadata["slug"] == "edited-slug"
-
-
- def test_get_post_form():
- _root, PostsService = setup()
- form = PostsService.get_post_form()
- assert form.data == {
- "title": None,
- "slug": None,
- "date": datetime.date.today(),
- "content": None
- }
-
- post = PostsService.create_post({
- "title": "Test Post",
- "slug": "test-post",
- "date": "2000-01-01",
- "content": "# Lorem ipsum dolor sit amet"
- })
- form = PostsService.get_post_form(post)
- assert form.data == {
- "title": "Test Post",
- "slug": "test-post",
- "date": datetime.date.fromisoformat("2000-01-01"),
- "content": "# Lorem ipsum dolor sit amet"
- }
|