Adds pagination to the return of the server
This commit is contained in:
parent
a0cefde50f
commit
c4f1dc1423
2 changed files with 41 additions and 156 deletions
|
@ -1,9 +1,9 @@
|
||||||
# cython: language_level=3
|
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import time
|
import time
|
||||||
import typing
|
import typing
|
||||||
|
import math
|
||||||
|
|
||||||
import nacl.hash
|
import nacl.hash
|
||||||
|
|
||||||
|
@ -22,28 +22,58 @@ def obtain_connection(filepath: str = None, row_factory: bool = True):
|
||||||
def get_claim_comments(conn: sqlite3.Connection, claim_id: str, parent_id: str = None,
|
def get_claim_comments(conn: sqlite3.Connection, claim_id: str, parent_id: str = None,
|
||||||
page: int = 1, page_size: int = 50, top_level=False):
|
page: int = 1, page_size: int = 50, top_level=False):
|
||||||
if top_level:
|
if top_level:
|
||||||
return [dict(row) for row in conn.execute(
|
results = [dict(row) for row in conn.execute(
|
||||||
""" SELECT *
|
""" SELECT *
|
||||||
FROM COMMENTS_ON_CLAIMS
|
FROM COMMENTS_ON_CLAIMS
|
||||||
WHERE claim_id LIKE ? AND parent_id IS NULL
|
WHERE claim_id LIKE ? AND parent_id IS NULL
|
||||||
LIMIT ? OFFSET ? """,
|
LIMIT ? OFFSET ? """,
|
||||||
(claim_id, page_size, page_size*(page - 1))
|
(claim_id, page_size, page_size*(page - 1))
|
||||||
)]
|
)]
|
||||||
|
count = conn.execute(
|
||||||
|
"""
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM COMMENTS_ON_CLAIMS
|
||||||
|
WHERE claim_id LIKE ? AND parent_id IS NULL
|
||||||
|
""", (claim_id, )
|
||||||
|
)
|
||||||
elif parent_id is None:
|
elif parent_id is None:
|
||||||
return [dict(row) for row in conn.execute(
|
results = [dict(row) for row in conn.execute(
|
||||||
""" SELECT *
|
""" SELECT *
|
||||||
FROM COMMENTS_ON_CLAIMS WHERE claim_id LIKE ?
|
FROM COMMENTS_ON_CLAIMS
|
||||||
|
WHERE claim_id LIKE ?
|
||||||
LIMIT ? OFFSET ? """,
|
LIMIT ? OFFSET ? """,
|
||||||
(claim_id, page_size, page_size*(page - 1))
|
(claim_id, page_size, page_size*(page - 1))
|
||||||
)]
|
)]
|
||||||
|
count = conn.execute(
|
||||||
|
"""
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM COMMENTS_ON_CLAIMS
|
||||||
|
WHERE claim_id LIKE ?
|
||||||
|
""", (claim_id,)
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
return [dict(row) for row in conn.execute(
|
results = [dict(row) for row in conn.execute(
|
||||||
""" SELECT *
|
""" SELECT *
|
||||||
FROM COMMENTS_ON_CLAIMS
|
FROM COMMENTS_ON_CLAIMS
|
||||||
WHERE claim_id LIKE ? AND parent_id = ?
|
WHERE claim_id LIKE ? AND parent_id = ?
|
||||||
LIMIT ? OFFSET ? """,
|
LIMIT ? OFFSET ? """,
|
||||||
(claim_id, parent_id, page_size, page_size*(page - 1))
|
(claim_id, parent_id, page_size, page_size*(page - 1))
|
||||||
)]
|
)]
|
||||||
|
count = conn.execute(
|
||||||
|
"""
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM COMMENTS_ON_CLAIMS
|
||||||
|
WHERE claim_id LIKE ? AND parent_id = ?
|
||||||
|
""", (claim_id, parent_id)
|
||||||
|
)
|
||||||
|
count = tuple(count.fetchone())[0]
|
||||||
|
return {
|
||||||
|
'items': results,
|
||||||
|
'page': page,
|
||||||
|
'page_size': page_size,
|
||||||
|
'total_pages': math.ceil(count/page_size),
|
||||||
|
'total_items': count
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def validate_input(**kwargs):
|
def validate_input(**kwargs):
|
||||||
|
|
|
@ -5,7 +5,7 @@ from faker.providers import internet
|
||||||
from faker.providers import lorem
|
from faker.providers import lorem
|
||||||
from faker.providers import misc
|
from faker.providers import misc
|
||||||
|
|
||||||
from src.database import get_comments_by_id, create_comment, get_comment_ids, create_comment_async, \
|
from src.database import get_comments_by_id, create_comment, get_comment_ids, \
|
||||||
get_claim_comments
|
get_claim_comments
|
||||||
from schema.db_helpers import setup_database, teardown_database
|
from schema.db_helpers import setup_database, teardown_database
|
||||||
from src.settings import config
|
from src.settings import config
|
||||||
|
@ -201,10 +201,13 @@ class ListDatabaseTest(DatabaseTestCase):
|
||||||
with self.subTest(claim_id=claim_id):
|
with self.subTest(claim_id=claim_id):
|
||||||
comments = get_claim_comments(self.conn, claim_id)
|
comments = get_claim_comments(self.conn, claim_id)
|
||||||
self.assertIsNotNone(comments)
|
self.assertIsNotNone(comments)
|
||||||
self.assertLessEqual(len(comments), 50)
|
self.assertGreater(comments['page_size'], 0)
|
||||||
top_comments = get_claim_comments(self.conn, claim_id, top_level=True, page=1, page_size=50)
|
top_comments = get_claim_comments(self.conn, claim_id, top_level=True, page=1, page_size=50)
|
||||||
self.assertIsNotNone(top_comments)
|
self.assertIsNotNone(top_comments)
|
||||||
self.assertLessEqual(len(top_comments), 50)
|
self.assertEqual(top_comments['page_size'], 50)
|
||||||
|
self.assertEqual(top_comments['page'], 1)
|
||||||
|
self.assertGreaterEqual(top_comments['total_pages'], 0)
|
||||||
|
self.assertGreaterEqual(top_comments['total_items'], 0)
|
||||||
comment_ids = get_comment_ids(self.conn, claim_id, page_size=50, page=1)
|
comment_ids = get_comment_ids(self.conn, claim_id, page_size=50, page=1)
|
||||||
with self.subTest(comment_ids=comment_ids):
|
with self.subTest(comment_ids=comment_ids):
|
||||||
self.assertIsNotNone(comment_ids)
|
self.assertIsNotNone(comment_ids)
|
||||||
|
@ -214,154 +217,6 @@ class ListDatabaseTest(DatabaseTestCase):
|
||||||
self.assertEqual(len(matching_comments), len(comment_ids))
|
self.assertEqual(len(matching_comments), len(comment_ids))
|
||||||
|
|
||||||
|
|
||||||
class AsyncWriteTest(AsyncioTestCase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
self.db_path = config['PATH']['TEST']
|
|
||||||
self.claimId = '529357c3422c6046d3fec76be2358004ba22e340'
|
|
||||||
|
|
||||||
async def asyncSetUp(self):
|
|
||||||
await super().asyncSetUp()
|
|
||||||
setup_database(self.db_path)
|
|
||||||
|
|
||||||
async def asyncTearDown(self):
|
|
||||||
await super().asyncTearDown()
|
|
||||||
teardown_database(self.db_path)
|
|
||||||
|
|
||||||
async def test01NamedComments(self):
|
|
||||||
comment = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
comment='This is a named comment',
|
|
||||||
channel_name='@username',
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358004ba22abcd',
|
|
||||||
)
|
|
||||||
self.assertIsNotNone(comment)
|
|
||||||
self.assertIsNone(comment['parent_id'])
|
|
||||||
previous_id = comment['comment_id']
|
|
||||||
reply = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
comment='This is a named response',
|
|
||||||
channel_name='@another_username',
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358004ba224bcd',
|
|
||||||
parent_id=previous_id
|
|
||||||
)
|
|
||||||
self.assertIsNotNone(reply)
|
|
||||||
self.assertEqual(reply['parent_id'], comment['comment_id'])
|
|
||||||
self.assertEqual(reply['claim_id'], comment['claim_id'])
|
|
||||||
|
|
||||||
async def test02AnonymousComments(self):
|
|
||||||
comment = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
comment='This is an ANONYMOUS comment'
|
|
||||||
)
|
|
||||||
self.assertIsNotNone(comment)
|
|
||||||
self.assertIsNone(comment['parent_id'])
|
|
||||||
previous_id = comment['comment_id']
|
|
||||||
reply = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
comment='This is an unnamed response',
|
|
||||||
parent_id=previous_id
|
|
||||||
)
|
|
||||||
self.assertIsNotNone(reply)
|
|
||||||
self.assertEqual(reply['parent_id'], comment['comment_id'])
|
|
||||||
self.assertEqual(reply['claim_id'], comment['claim_id'])
|
|
||||||
|
|
||||||
async def test03SignedComments(self):
|
|
||||||
comment = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
comment='I like big butts and i cannot lie',
|
|
||||||
channel_name='@sirmixalot',
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358005ba22abcd',
|
|
||||||
signature='siggy'
|
|
||||||
)
|
|
||||||
self.assertIsNotNone(comment)
|
|
||||||
self.assertIsNone(comment['parent_id'])
|
|
||||||
previous_id = comment['comment_id']
|
|
||||||
reply = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
comment='This is a LBRY verified response',
|
|
||||||
channel_name='@LBRY',
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358001ba224bcd',
|
|
||||||
parent_id=previous_id,
|
|
||||||
signature='Cursive Font Goes Here'
|
|
||||||
)
|
|
||||||
self.assertIsNotNone(reply)
|
|
||||||
self.assertEqual(reply['parent_id'], comment['comment_id'])
|
|
||||||
self.assertEqual(reply['claim_id'], comment['claim_id'])
|
|
||||||
|
|
||||||
async def test04UsernameVariations(self):
|
|
||||||
invalid_comment = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
channel_name='$#(@#$@#$',
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358001ba224b23',
|
|
||||||
comment='this is an invalid username'
|
|
||||||
)
|
|
||||||
self.assertIsNone(invalid_comment)
|
|
||||||
valid_username = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
channel_name='@' + 'a'*255,
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358001ba224b23',
|
|
||||||
comment='this is a valid username'
|
|
||||||
)
|
|
||||||
self.assertIsNotNone(valid_username)
|
|
||||||
|
|
||||||
lengthy_username = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
channel_name='@' + 'a'*256,
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358001ba224b23',
|
|
||||||
comment='this username is too long'
|
|
||||||
)
|
|
||||||
self.assertIsNone(lengthy_username)
|
|
||||||
comment = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
channel_name='',
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358001ba224b23',
|
|
||||||
comment='this username should not default to ANONYMOUS'
|
|
||||||
)
|
|
||||||
self.assertIsNone(comment)
|
|
||||||
short_username = await create_comment_async(
|
|
||||||
self.db_path,
|
|
||||||
claim_id=self.claimId,
|
|
||||||
channel_name='@',
|
|
||||||
channel_id='529357c3422c6046d3fec76be2358001ba224b23',
|
|
||||||
comment='this username is too short'
|
|
||||||
)
|
|
||||||
self.assertIsNone(short_username)
|
|
||||||
|
|
||||||
async def test06GenerateAndListComments(self):
|
|
||||||
top_comments, claim_ids = generate_top_comments()
|
|
||||||
total, success = 0, 0
|
|
||||||
for _, comments in top_comments.items():
|
|
||||||
for i, comment in enumerate(comments):
|
|
||||||
result = await create_comment_async(self.db_path, **comment)
|
|
||||||
if result:
|
|
||||||
success += 1
|
|
||||||
comments[i] = result
|
|
||||||
del comment
|
|
||||||
total += len(comments)
|
|
||||||
self.assertEqual(total, success)
|
|
||||||
self.assertGreater(total, 0)
|
|
||||||
success, total = 0, 0
|
|
||||||
for reply in generate_replies(top_comments):
|
|
||||||
inserted_reply = await create_comment_async(self.db_path, **reply)
|
|
||||||
if inserted_reply:
|
|
||||||
success += 1
|
|
||||||
total += 1
|
|
||||||
|
|
||||||
self.assertEqual(success, total)
|
|
||||||
self.assertGreater(success, 0)
|
|
||||||
|
|
||||||
|
|
||||||
def generate_replies(top_comments):
|
def generate_replies(top_comments):
|
||||||
return [{
|
return [{
|
||||||
'claim_id': comment['claim_id'],
|
'claim_id': comment['claim_id'],
|
||||||
|
|
Loading…
Reference in a new issue