Skip to content

Commit

Permalink
update testbed web_service
Browse files Browse the repository at this point in the history
  • Loading branch information
Sushobhan Parajuli committed Feb 5, 2025
1 parent adf45f7 commit fd093c9
Show file tree
Hide file tree
Showing 6 changed files with 217 additions and 5 deletions.
16 changes: 15 additions & 1 deletion tests/web_service/test_basic_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,25 @@ def test_basic_request(service, mind_data, pipeline): # noqa: F811
request_generator = RequestGenerator(mind_data())
request_generator.add_candidates(100)
request_generator.add_clicks(num_clicks=37, num_days=7)
request_generator.add_topics(["Science", "Technology", "Sports", "Lifestyle", "Oddities"])
request_generator.add_topics(
[
"Science",
"Technology",
"Sports",
"Lifestyle",
"Oddities",
]
)
request_generator.set_num_recs(10)
req_body = request_generator.get_request()

logger.info("sending request")
response = service.request(req_body, pipeline)
logger.info("response: %s", response.model_dump_json(indent=2))
assert response.recommendations
assert response.recommendations.values()
recs = next(iter(response.recommendations.values()))
assert len(recs) > 0
assert len(recs) == request_generator.num_recs
article_ids = [article.article_id for article in recs]
assert len(article_ids) == len(set(article_ids))
68 changes: 68 additions & 0 deletions tests/web_service/test_heavy_interaction_history.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"""
Validate edge case: a user with long history of clicks and onboarding topics
"""

import logging
import warnings

from pydantic import ValidationError
from pytest import mark, skip

from poprox_concepts.api.recommendations import RecommendationRequest, RecommendationResponse
from poprox_recommender.config import allow_data_test_failures
from poprox_recommender.recommenders import recommendation_pipelines
from poprox_recommender.request_generator import RequestGenerator
from poprox_recommender.testing import auto_service as service
from poprox_recommender.testing import mind_data

logger = logging.getLogger(__name__)
try:
PIPELINES = recommendation_pipelines().keys()
except Exception as e:
warnings.warn("failed to load models, did you run `dvc pull`?")
if allow_data_test_failures():
skip("recommendation pipelines unavailable", allow_module_level=True)
else:
raise e


@mark.docker
@mark.parametrize("pipeline", PIPELINES)
def test_heavy_interaction_history(service, mind_data, pipeline): # noqa: F811
"""
Initialize request data
"""
request_generator = RequestGenerator(mind_data())
request_generator.add_candidates(100)
request_generator.add_clicks(num_clicks=100, num_days=10)
request_generator.add_topics(
[
"U.S. news",
"World news",
"Politics",
"Business",
"Entertainment",
"Sports",
"Health",
"Science",
"Technology",
"Lifestyle",
"Religion",
"Climate and environment",
"Education",
"Oddities",
]
)
request_generator.set_num_recs(10)
req_body = request_generator.get_request()

logger.info("sending request")
response = service.request(req_body, pipeline)
logger.info("response: %s", response.model_dump_json(indent=2))
assert response.recommendations
assert response.recommendations.values()
recs = next(iter(response.recommendations.values()))
assert len(recs) > 0
assert len(recs) == request_generator.num_recs
article_ids = [article.article_id for article in recs]
assert len(article_ids) == len(set(article_ids))
20 changes: 17 additions & 3 deletions tests/web_service/test_no_clicks.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,32 @@

@mark.docker
@mark.parametrize("pipeline", PIPELINES)
def test_basic_request(service, mind_data, pipeline): # noqa: F811
def test_no_clicks(service, mind_data, pipeline): # noqa: F811
"""
Initialize request data
"""
request_generator = RequestGenerator(mind_data())
request_generator.add_candidates(100)
request_generator.add_clicks(num_clicks=0, num_days=0)
request_generator.add_topics(["Science", "Technology", "Sports", "Lifestyle", "Oddities"])
request_generator.add_clicks(num_clicks=0, num_days=10)
request_generator.add_topics(
[
"Science",
"Technology",
"Sports",
"Lifestyle",
"Oddities",
]
)
request_generator.set_num_recs(10)
req_body = request_generator.get_request()

logger.info("sending request")
response = service.request(req_body, pipeline)
logger.info("response: %s", response.model_dump_json(indent=2))
assert response.recommendations
assert response.recommendations.values()
recs = next(iter(response.recommendations.values()))
assert len(recs) > 0
assert len(recs) == request_generator.num_recs
article_ids = [article.article_id for article in recs]
assert len(article_ids) == len(set(article_ids))
51 changes: 51 additions & 0 deletions tests/web_service/test_no_clicks_no_onboarding.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""
Validate edge case: user has no click history & no onboarding preferences
"""

import logging
import warnings

from pydantic import ValidationError
from pytest import mark, skip

from poprox_concepts.api.recommendations import RecommendationRequest, RecommendationResponse
from poprox_recommender.config import allow_data_test_failures
from poprox_recommender.recommenders import recommendation_pipelines
from poprox_recommender.request_generator import RequestGenerator
from poprox_recommender.testing import auto_service as service
from poprox_recommender.testing import mind_data

logger = logging.getLogger(__name__)
try:
PIPELINES = recommendation_pipelines().keys()
except Exception as e:
warnings.warn("failed to load models, did you run `dvc pull`?")
if allow_data_test_failures():
skip("recommendation pipelines unavailable", allow_module_level=True)
else:
raise e


@mark.docker
@mark.parametrize("pipeline", PIPELINES)
def test_no_clicks_no_onboarding(service, mind_data, pipeline): # noqa: F811
"""
Initialize request data
"""
request_generator = RequestGenerator(mind_data())
request_generator.add_candidates(100)
request_generator.add_clicks(num_clicks=0, num_days=0)
request_generator.add_topics([])
request_generator.set_num_recs(10)
req_body = request_generator.get_request()

logger.info("sending request")
response = service.request(req_body, pipeline)
logger.info("response: %s", response.model_dump_json(indent=2))
assert response.recommendations
assert response.recommendations.values()
recs = next(iter(response.recommendations.values()))
assert len(recs) > 0
assert len(recs) == request_generator.num_recs
article_ids = [article.article_id for article in recs]
assert len(article_ids) == len(set(article_ids))
8 changes: 7 additions & 1 deletion tests/web_service/test_no_onboarding.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

@mark.docker
@mark.parametrize("pipeline", PIPELINES)
def test_basic_request(service, mind_data, pipeline): # noqa: F811
def test_no_onboarding(service, mind_data, pipeline): # noqa: F811
"""
Initialize request data
"""
Expand All @@ -43,3 +43,9 @@ def test_basic_request(service, mind_data, pipeline): # noqa: F811
response = service.request(req_body, pipeline)
logger.info("response: %s", response.model_dump_json(indent=2))
assert response.recommendations
assert response.recommendations.values()
recs = next(iter(response.recommendations.values()))
assert len(recs) > 0
assert len(recs) == request_generator.num_recs
article_ids = [article.article_id for article in recs]
assert len(article_ids) == len(set(article_ids))
59 changes: 59 additions & 0 deletions tests/web_service/test_sparse_interaction_history.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
Validate edge case: a user with only one click over several days
"""

import logging
import warnings

from pydantic import ValidationError
from pytest import mark, skip

from poprox_concepts.api.recommendations import RecommendationRequest, RecommendationResponse
from poprox_recommender.config import allow_data_test_failures
from poprox_recommender.recommenders import recommendation_pipelines
from poprox_recommender.request_generator import RequestGenerator
from poprox_recommender.testing import auto_service as service
from poprox_recommender.testing import mind_data

logger = logging.getLogger(__name__)
try:
PIPELINES = recommendation_pipelines().keys()
except Exception as e:
warnings.warn("failed to load models, did you run `dvc pull`?")
if allow_data_test_failures():
skip("recommendation pipelines unavailable", allow_module_level=True)
else:
raise e


@mark.docker
@mark.parametrize("pipeline", PIPELINES)
def test_sparse_interaction_history(service, mind_data, pipeline): # noqa: F811
"""
Initialize request data
"""
request_generator = RequestGenerator(mind_data())
request_generator.add_candidates(100)
request_generator.add_clicks(num_clicks=1, num_days=10)
request_generator.add_topics(
[
"Science",
"Technology",
"Sports",
"Lifestyle",
"Oddities",
]
)
request_generator.set_num_recs(10)
req_body = request_generator.get_request()

logger.info("sending request")
response = service.request(req_body, pipeline)
logger.info("response: %s", response.model_dump_json(indent=2))
assert response.recommendations
assert response.recommendations.values()
recs = next(iter(response.recommendations.values()))
assert len(recs) > 0
assert len(recs) == request_generator.num_recs
article_ids = [article.article_id for article in recs]
assert len(article_ids) == len(set(article_ids))

0 comments on commit fd093c9

Please sign in to comment.