Skip to content

Commit 7df6771

Browse files
committed
Initial document CRUD tests
* Test for read_* methods * Infrastructure for making it work (utils)
1 parent 0a5c896 commit 7df6771

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import functools as ft
2+
from uuid import UUID
3+
from pathlib import Path
4+
5+
from sqlmodel import Session, delete
6+
from sqlalchemy.exc import IntegrityError
7+
from sqlalchemy.dialects.sqlite import insert
8+
9+
from app.crud import DocumentCrud
10+
from app.core.config import settings
11+
from app.crud.user import get_user_by_email
12+
from app.models import Document, UserCreate
13+
14+
class Constants:
15+
n_documents = 10
16+
17+
@ft.cache
18+
def get_user_id_by_email(session: Session):
19+
user = get_user_by_email(session=session, email=settings.FIRST_SUPERUSER)
20+
return user.id
21+
22+
23+
@ft.cache
24+
def int_to_uuid(value):
25+
return UUID(int=value)
26+
27+
def rm_documents(session: Session):
28+
session.exec(delete(Document))
29+
session.commit()
30+
31+
def insert_documents(session: Session, n: int):
32+
owner_id = get_user_id_by_email(session)
33+
34+
crud = DocumentCrud(session)
35+
for i in range(n):
36+
args = str(int_to_uuid(i)).split('-')
37+
fname = Path('/', *args).with_suffix('.xyz')
38+
document = Document(
39+
id=int_to_uuid(i),
40+
owner_id=owner_id,
41+
fname=fname.name,
42+
object_store_url=fname.as_uri(),
43+
)
44+
session.add(document)
45+
session.commit()
46+
session.refresh(document)
47+
48+
yield document
49+
50+
def insert_document(session: Session):
51+
(document, ) = insert_documents(session, 1)
52+
return document
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import pytest
2+
from sqlmodel import Session
3+
4+
from app.crud import DocumentCrud
5+
from app.core.config import settings
6+
7+
from _utils import (
8+
Constants,
9+
get_user_id_by_email,
10+
insert_documents,
11+
int_to_uuid,
12+
rm_documents,
13+
)
14+
15+
@pytest.fixture
16+
def document_collection(db: Session):
17+
rm_documents(db)
18+
return list(insert_documents(db, Constants.n_documents))
19+
20+
@pytest.fixture(scope='class')
21+
def clean_db_fixture(db: Session):
22+
yield
23+
rm_documents(db)
24+
25+
@pytest.mark.usefixtures('clean_db_fixture')
26+
class TestDatabaseReadMany:
27+
def test_number_read_is_expected(
28+
self,
29+
db: Session,
30+
document_collection: list,
31+
):
32+
crud = DocumentCrud(db)
33+
owner_id = get_user_id_by_email(db)
34+
documents = crud.read_many(owner_id)
35+
36+
assert len(documents) == Constants.n_documents
37+
38+
def test_deleted_docs_excluded(
39+
self,
40+
db: Session,
41+
document_collection: list,
42+
):
43+
assert all(x.deleted_at is None for x in document_collection)
44+
45+
def test_skip_is_respected(
46+
self,
47+
db: Session,
48+
document_collection: list,
49+
):
50+
crud = DocumentCrud(db)
51+
owner_id = get_user_id_by_email(db)
52+
skip = Constants.n_documents // 2
53+
doc_ids = set(x.id for x in crud.read_many(owner_id, skip=skip))
54+
55+
for i in range(skip, Constants.n_documents):
56+
doc = int_to_uuid(i)
57+
assert doc in doc_ids
58+
59+
def test_limit_is_respected(
60+
self,
61+
db: Session,
62+
document_collection: list,
63+
):
64+
crud = DocumentCrud(db)
65+
owner_id = get_user_id_by_email(db)
66+
limit = Constants.n_documents // 2
67+
documents = crud.read_many(owner_id, limit=limit)
68+
69+
assert len(documents) == limit
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import pytest
2+
from sqlmodel import Session
3+
from sqlalchemy.exc import NoResultFound
4+
5+
from app.crud import DocumentCrud
6+
7+
from _utils import insert_document, int_to_uuid, rm_documents
8+
9+
@pytest.fixture
10+
def clean_db_fixture(db: Session):
11+
rm_documents(db)
12+
yield
13+
rm_documents(db)
14+
15+
class TestDatabaseReadOne:
16+
def test_can_select_valid_id(
17+
self,
18+
db: Session,
19+
clean_db_fixture: None,
20+
):
21+
crud = DocumentCrud(db)
22+
document = insert_document(db)
23+
result = crud.read_one(document.id)
24+
25+
assert result.id == document.id
26+
27+
def test_cannot_select_invalid_id(
28+
self,
29+
db: Session,
30+
clean_db_fixture: None,
31+
):
32+
crud = DocumentCrud(db)
33+
document_id = int_to_uuid(0)
34+
with pytest.raises(NoResultFound):
35+
crud.read_one(document_id)

0 commit comments

Comments
 (0)