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, [])