Compare commits

...

6 Commits

Author SHA1 Message Date
Colin Goutte 9911d0f973 Migrate to unittests : ":%s/\(def test_.*(\)/\0self/c" 2023-08-27 23:09:05 +02:00
Colin Goutte 6a931228c3 Suggestion : Search with dynamic parameters 2023-08-27 23:08:35 +02:00
Colin Goutte b985e7590a Factorise token, skip period test 2023-08-27 22:12:29 +02:00
Colin Goutte 0b09021d5c test word separators 2023-08-27 21:42:54 +02:00
Colin Goutte 97af8ea80f Use like instead of equal 2023-08-27 21:37:47 +02:00
Colin Goutte 0ae18d01d2 Failin test for a token 2023-08-27 21:29:12 +02:00
4 changed files with 180 additions and 107 deletions

View File

@ -3,4 +3,4 @@ Nogo:
Caveats:
Issue in database / session management for tests, out of scope to unserstand no
Issue in database / session management for tests, out of scope to unserstand now

View File

@ -16,7 +16,7 @@ run_dev:
git ls-files | entr -r pipenv run python dev.py
tdd:
git ls-files | entr make test opt='$(opt)'
git ls-files | entr make test opt='$(opt)'
git ls-files | entr make functionnal_tests
refactor_tdd:
@ -29,6 +29,7 @@ watch_db:
test:
pipenv run pytest $(coverage_opt) $(opt) utests
make functional_tests
functionnal_tests:
pipenv run python -m pytest functionnal_test.py

19
crud.py
View File

@ -42,6 +42,25 @@ def get_all_movies(db: Session):
return db_movie.all()
def search_movie(db: Session, term: str = "", *criterions):
db_movies = db.query(models.Movie)
exp = f"%{term}%"
# Use regex instead ? still \W is had to escape
if term:
db_movies = db_movies.where(
sqlalchemy.or_(
models.Movie.title.like(exp),
models.Movie.description.like(exp),
)
)
# would try the following approache for dynamic search
for colnamename, opname, value in criterions:
db_movies = db_movies.where(getattr(getattr(models.Movie, name), opname)(value))
return db_movies
def get_movie_by_id(db: Session, id_: str = ""):
try:
id_ = int(id_)

View File

@ -9,6 +9,9 @@ from dev import app, get_db
from models import Movie
import pytest
import unittest
import crud
import contextlib
@ -66,132 +69,182 @@ def rand_name():
return name
def test_create_moviem_models():
name = rand_name()
movie = Movie(title=name)
assert movie.title == name
class CrudModelsTestCase(unittest.TestCase):
def test_create_moviem_models(self):
name = rand_name()
movie = Movie(title=name)
assert movie.title == name
def test_sample_crud(self):
name = rand_name()
def test_sample_crud():
name = rand_name()
with db_context() as db:
movie = crud.create_movie(db, title=name, genres=["Yes", "No"])
assert movie.title == name
def test_genre_custom_type_serialize_value():
name = rand_name()
genres = ["Yes", "No"]
with db_context() as db:
movie = crud.create_movie(db, title=name, genres=genres)
assert movie.genres == genres
def test_genre_custom_type_serialize_type():
name = rand_name()
genres = ["Yes", "No"]
csv_genres = ",".join(genres)
try:
with db_context() as db:
movie = crud.create_movie(db, title=name, genres=csv_genres)
except (ValueError, exc.StatementError) as error:
assert "tuple" in str(error)
else:
raise RuntimeError("Exception should have been raised")
movie = crud.create_movie(db, title=name, genres=["Yes", "No"])
assert movie.title == name
def test_genre_custom_type_serialize_value(self):
name = rand_name()
def test_list_movies():
clear_db()
response = client.get("/movies/")
# assert response.json() == []
N = 10
names = []
with db_context() as db:
for _ in range(N):
name = rand_name()
names.append(name)
crud.create_movie(db, title=name, genres=["Animated", "Paropaganda"])
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
assert all(movies_by_title[name] for name in names)
def test_search_movies():
clear_db()
response = client.get("/movies/")
# assert response.json() == []
radix = rand_name()
name = radix + "test_search"
desc = radix + "test_desription"
with db_context() as db:
movie_name = crud.create_movie(
db, title=name, genres=["Animated", "Paropaganda"]
)
movie_desc = crud.create_movie(
db, title=radix, description=desc, genres=["Animated", "Paropaganda"]
)
for term, target in zip((name, desc), (movie_name, movie_desc)):
genres = ["Yes", "No"]
with db_context() as db:
movie = crud.create_movie(db, title=name, genres=genres)
assert movie.genres == genres
def test_genre_custom_type_serialize_type(self):
name = rand_name()
genres = ["Yes", "No"]
csv_genres = ",".join(genres)
try:
with db_context() as db:
movie = crud.create_movie(db, title=name, genres=csv_genres)
except (ValueError, exc.StatementError) as error:
assert "tuple" in str(error)
else:
raise RuntimeError("Exception should have been raised")
def test_list_movies(self):
clear_db()
response = client.get("/movies/")
# assert response.json() == []
N = 10
names = []
with db_context() as db:
for _ in range(N):
name = rand_name()
names.append(name)
crud.create_movie(db, title=name, genres=["Animated", "Paropaganda"])
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
assert all(movies_by_title[name] for name in names)
def test_search_movies_exact(self):
clear_db()
response = client.get("/movies/")
# assert response.json() == []
radix = rand_name()
title = radix + "test_search_title"
desc = radix + "test_search_desription"
with db_context() as db:
movie_title = crud.create_movie(
db, title=title, genres=["Animated", "Paropaganda"]
)
movie_desc = crud.create_movie(
db, title=radix, description=desc, genres=["Animated", "Paropaganda"]
)
movie_desc_id = movie_desc.id
found = crud.search_movie(db, title).all()
assert len(found) == 1
assert found[0] == movie_title
found = crud.search_movie(db, desc).all()
assert len(found) == 1
assert target == found[0]
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
assert all(movies_by_title[name] for name in names)
assert found[0] == movie_desc
def test_search_movies_token(self):
clear_db()
response = client.get("/movies/")
# assert response.json() == []
def test_sample_import_toy_story():
clear_db()
radix = rand_name()
movie_title = "Toy Story"
file_path = "input_data/movies_metadata_short.csv"
title = radix + "test_search_title titletoken"
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
desc = radix + "test_search_desription desctoken"
assert movie_title not in movies_by_title, "The movie should not be pre existing"
with db_context() as db:
movie_title = crud.create_movie(
db, title=title, genres=["Animated", "Paropaganda"]
)
with db_context() as db:
fill_db(db, file_path)
movie_desc = crud.create_movie(
db, title=radix, description=desc, genres=["Animated", "Paropaganda"]
)
movie_desc_id = movie_desc.id
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
found = crud.search_movie(db, "titletoken").all()
assert len(found) == 1
toy_story = movies_by_title["Toy Story"]
assert found[0] == movie_title
assert "Andy" in toy_story["description"]
found = crud.search_movie(db, "desctoken").all()
assert len(found) == 1
assert found[0] == movie_desc
def test_title_is_taken_form_original_title_is_missing():
"""
t0113002,en,Midnight Man
19763 Midnight Man (among others) has an unescaped \n that makes import fail
def test_search_movies_token_period(self):
return
clear_db()
response = client.get("/movies/")
# assert response.json() == []
in the csv the movie 'Avalanche Sharks' @ line 35587
has no tiltle, we fix this here to get quicker but we need a better solution
"""
movie_title = "Midnight Man"
radix = rand_name()
file_path = "utests/movie_error_missing_title.csv"
file_path = "input_data/movies_metadata.csv"
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
title = radix + "test_search_title title3tokenperiod."
assert movie_title not in movies_by_title, "The movie should not be pre existing"
with db_context() as db:
fill_db(db, file_path, sample_rate=1)
with db_context() as db:
movie_title = crud.create_movie(
db, title=title, genres=["Animated", "Paropaganda"]
)
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
found = crud.search_movie(db, "title3tokenpreriod").all()
assert len(found) == 1
assert found[0] == movie_title
def test_sample_import_toy_story(self):
clear_db()
movie_title = "Toy Story"
file_path = "input_data/movies_metadata_short.csv"
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
assert (
movie_title not in movies_by_title
), "The movie should not be pre existing"
with db_context() as db:
fill_db(db, file_path)
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
toy_story = movies_by_title["Toy Story"]
assert "Andy" in toy_story["description"]
def test_title_is_taken_form_original_title_is_missing(self):
"""
t0113002,en,Midnight Man
19763 Midnight Man (among others) has an unescaped \n that makes import fail
in the csv the movie 'Avalanche Sharks' @ line 35587
has no tiltle, we fix this here to get quicker but we need a better solution
"""
movie_title = "Midnight Man"
file_path = "utests/movie_error_missing_title.csv"
file_path = "input_data/movies_metadata.csv"
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}
assert (
movie_title not in movies_by_title
), "The movie should not be pre existing"
with db_context() as db:
fill_db(db, file_path, sample_rate=1)
movies = client.get("movies").json()["movies"]
movies_by_title = {m["title"]: m for m in movies}