# 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()