owenrusk.dev

errands

small jobs the runtime does for the studio.

git clone https://owenrusk.dev/errands.git

errands / tests/test_posts.py -rw-r--r-- · 2548 bytes

 1 import tempfile
 2 import unittest
 3 from datetime import datetime, timedelta, timezone
 4 from pathlib import Path
 5 
 6 from errands import posts
 7 
 8 CENTRAL = timezone(timedelta(hours=-6))
 9 
10 
11 def post(site: Path, name: str, date: str | None) -> Path:
12     front = f"---\ntitle: {name}\ndate: {date}\n---\n" if date else f"---\ntitle: {name}\n---\n"
13     path = site / "scheduled" / f"{name}.md"
14     path.write_text(front + "\nbody\n")
15     return path
16 
17 
18 class PublishTest(unittest.TestCase):
19     def setUp(self):
20         self.dir = tempfile.TemporaryDirectory()
21         self.site = Path(self.dir.name)
22         (self.site / "scheduled").mkdir()
23         (self.site / "posts").mkdir()
24         self.runs = []
25 
26     def tearDown(self):
27         self.dir.cleanup()
28 
29     def record(self, args, **kwargs):
30         self.runs.append(args)
31 
32     def test_moves_only_what_is_due(self):
33         post(self.site, "test-post", "2024-11-20T09:00:00-06:00")
34         post(self.site, "later-post", "2024-12-20T09:00:00-06:00")
35         now = datetime(2024, 11, 21, 12, 0, tzinfo=CENTRAL)
36         self.assertEqual(posts.publish_due(now, self.site, self.record), ["test-post"])
37         self.assertTrue((self.site / "posts" / "test-post.md").exists())
38         self.assertTrue((self.site / "scheduled" / "later-post.md").exists())
39         self.assertEqual(self.runs, [["make", "publish"]])
40 
41     def test_one_publish_for_two_posts(self):
42         post(self.site, "test-post", "2024-11-20T09:00:00-06:00")
43         post(self.site, "other-post", "2024-11-20T09:00:00-06:00")
44         now = datetime(2024, 11, 21, 12, 0, tzinfo=CENTRAL)
45         self.assertEqual(posts.publish_due(now, self.site, self.record), ["other-post", "test-post"])
46         self.assertEqual(len(self.runs), 1)
47 
48     def test_date_without_a_zone(self):
49         post(self.site, "test-post", "2024-11-20T09:00:00")
50         now = datetime(2024, 11, 21, 12, 0, tzinfo=CENTRAL)
51         self.assertEqual(posts.publish_due(now, self.site, self.record), ["test-post"])
52 
53     def test_scheduled(self):
54         post(self.site, "test-post", "2024-11-20T09:00:00-06:00")
55         post(self.site, "draft", None)
56         self.assertEqual(
57             posts.scheduled(self.site),
58             [{"post": "draft", "at": "None"}, {"post": "test-post", "at": "2024-11-20 09:00:00-06:00"}],
59         )
60 
61     def test_no_date_never_goes_out(self):
62         post(self.site, "draft", None)
63         now = datetime(2030, 1, 1, tzinfo=CENTRAL)
64         self.assertEqual(posts.publish_due(now, self.site, self.record), [])
65         self.assertEqual(self.runs, [])