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'), "SITE_NAME": "test website", "MARKDOWN_PREVIEW": True })) # 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('''

{{ post.title }}

{{ post.content }}
''') # 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 == '''

Test Post

Lorem ipsum dolor sit amet

''' # 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" }