From b736068ee7b82e05c2ede8bc48ace7ffa4709e29 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Wed, 24 Jul 2024 23:40:11 -0400 Subject: Initial commit. --- utils/monolith_test.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 utils/monolith_test.py (limited to 'utils/monolith_test.py') diff --git a/utils/monolith_test.py b/utils/monolith_test.py new file mode 100644 index 0000000..b4e1b30 --- /dev/null +++ b/utils/monolith_test.py @@ -0,0 +1,96 @@ +# Chris Xiong 2024 +# License: Expat (MIT) +# +# Basic unit tests for the Python Monolith class + +import monolith +import unittest +import random +import os +from mmap import mmap + +def randstr(len): + return ''.join(random.choices(''.join([chr(i + ord('0')) for i in range(0, 75)]), k=len)) + +def randpost(last_time): + content = randstr(random.randint(10, 1024)) + date = random.randint(last_time + 1, last_time + 999999) + media = [] + tags = [] + for _ in range(0, random.randint(0, 9)): + media.append(monolith.MediaInstance.makeImage(randstr(20), randstr(20))) + for _ in range(0, random.randint(0, 4)): + tags.append(randstr(random.randint(1, 8))) + return monolith.Post(content, date, media, tags) + +def posteq(a, b): + if a is None or b is None: + return False + if len(a.media) != len(b.media) or len(a.tags) != len(b.tags): + return False + for x, y in zip(a.media, b.media): + if x.thumbnail != y.thumbnail or x.original != y.original: + return False + for x, y in zip(a.tags, b.tags): + if x != y: return False + return a.content == b. content and a.date == b.date + +class TestMonolith(unittest.TestCase): + def test_replace(self): + posts = [] + filename = "rep.monolith" + m = monolith.Monolith(filename) + p1 = randpost(123) + p2 = randpost(p1.date) + p3 = randpost(0) + p3.date = p1.date + m.append(p1) + m.append(p2) + m.replace_post(p1.date, p3) + self.assertTrue(posteq(m.get_post(p3.date), p3)) + self.assertTrue(posteq(m.get_post(p2.date), p2)) + + def test_combined(self): + posts = [] + filename = "test.monolith" + if True: + m = monolith.Monolith(filename) + last_time = 0 + for _ in range(0, 100): + op = 1 if random.random() < 0.2 else 0 + if op == 1 and len(posts) == 0: + op = 0 + if op == 0: + p = randpost(last_time) + last_time = p.date + posts.append(p) + m.append(p) + elif op == 1: + p = randpost(0) + position = random.randint(0, len(posts) - 1) + p.date = posts[position].date + posts[position] = p + m.replace_post(p.date, p) + m.write_index() + m.generate_page_index() + for p in posts: + pp = m.get_post(p.date) + self.assertTrue(posteq(p, pp)) + + with open(filename, "r+b") as f: + d = mmap(f.fileno(), 0) + for _, _, r in m.postranges: + self.assertEqual(d[r - 1 : r], b'\v') + if True: + m = monolith.Monolith(filename) + m.load_index() + dates = m.get_all_dates() + self.assertEqual(len(dates), len(posts)) + for t, p in zip(dates, posts): + self.assertEqual(t, p.date) + for t, p in zip(dates, posts): + self.assertTrue(posteq(p, m.get_post(t))) + + +if __name__ == "__main__": + unittest.main() -- cgit v1.2.3