Skip to content

Commit

Permalink
feat: update int tests
Browse files Browse the repository at this point in the history
  • Loading branch information
cdelabre committed Sep 9, 2024
1 parent 729fa61 commit ba0aec2
Show file tree
Hide file tree
Showing 11 changed files with 174 additions and 1,771 deletions.
24 changes: 15 additions & 9 deletions .github/workflows/reusable_api_reco_integration_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ on:
env:
DATA_GCP_PROJECT: ${{ vars.DATA_GCP_PROJECT }}
API_LOCAL: 1
API_RECO_SECRET_NAME: ${{ vars.API_RECO_SECRET_NAME }}
API_BACKEND_REFRESH_TOKEN_NAME: ${{ vars.API_BACKEND_REFRESH_TOKEN_NAME }}

jobs:
tests-integration-api-reco:
Expand All @@ -27,10 +27,9 @@ jobs:
permissions:
contents: 'write'
id-token: 'write'
container: postman/newman:5.3
defaults:
run:
working-directory: "apps/recommendation/api/postman"
run:
working-directory: "apps/recommendation/api/api_tests"
steps:
- uses: actions/checkout@v4
- name: "Connect to Secret Manager"
Expand All @@ -52,17 +51,24 @@ jobs:
with:
workload_identity_provider: ${{ steps.secrets.outputs.ARTIFACT_REGISTRY_WORKLOAD_IDENTITY_PROVIDER }}
service_account: ${{ steps.secrets.outputs.ARTIFACT_REGISTRY_SERVICE_ACCOUNT }}
- uses: actions/setup-python@v4.7.0
with:
python-version: "3.10"
- name: "Get secrets data for Slack"
id: 'secrets-data'
uses: 'google-github-actions/get-secretmanager-secrets@v2'
with:
secrets: |-
API_RECO_TOKEN:${{ env.DATA_GCP_PROJECT }}/${{ env.API_RECO_SECRET_NAME }}
- name: "Run tests collection"
API_REFRESH_TOKEN:${{ env.DATA_GCP_PROJECT }}/${{ env.API_BACKEND_REFRESH_TOKEN_NAME }}
- uses: yezz123/setup-uv@v4
- name : "Install requirements"
run: uv pip install --system -r requirements.txt

- name : "Run tests"
run: |
newman run api_integration_tests.postman_collection.json \
--environment ${{ inputs.TARGET_ENV }}.postman_environment.json \
--env-var "api_token=${{ steps.secrets-data.outputs.API_RECO_TOKEN }}"
export ENV_SHORT_NAME='${{ inputs.TARGET_ENV }}'
export REFRESH_TOKEN='${{ steps.secrets-data.outputs.API_REFRESH_TOKEN }}'
pytest --cov
- name: "Post to a Slack channel"
if: failure()
uses: slackapi/slack-github-action@v1.23.0
Expand Down
43 changes: 43 additions & 0 deletions apps/recommendation/api/api_tests/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import os

import pytest
import requests

ENVIRONMENTS = {
"dev": {
"API_URL": "https://backend.testing.passculture.team",
"OFFER_ID": "440",
},
"staging": {
"API_URL": "https://backend.staging.passculture.team",
"OFFER_ID": "45093803",
},
"production": {
"API_URL": "https://backend.passculture.team",
"OFFER_ID": "87654321",
},
}


def get_environment_config():
env = os.environ["ENV_SHORT_NAME"]
defaults = ENVIRONMENTS[env]
defaults["ACCESS_TOKEN"] = os.environ["ACCESS_TOKEN"]
return defaults


@pytest.fixture(scope="session")
def env():
return get_environment_config()


@pytest.fixture(scope="session")
def bearer_token(env):
url = f"{env['API_URL']}/native/v1/refresh_access_token"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {env['ACCESS_TOKEN']}",
}
data = {}
response = requests.post(url, json=data, headers=headers)
return response.json()["accessToken"]
1 change: 1 addition & 0 deletions apps/recommendation/api/api_tests/requirements.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pytest-cov==2.10.1
18 changes: 18 additions & 0 deletions apps/recommendation/api/api_tests/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# This file was autogenerated by uv via the following command:
# uv pip compile requirements.in -o requirements.txt --python-platform=linux
coverage==7.6.1
# via pytest-cov
exceptiongroup==1.2.2
# via pytest
iniconfig==2.0.0
# via pytest
packaging==24.1
# via pytest
pluggy==1.5.0
# via pytest
pytest==8.3.2
# via pytest-cov
pytest-cov==2.10.1
# via -r requirements.in
tomli==2.0.1
# via pytest
63 changes: 63 additions & 0 deletions apps/recommendation/api/api_tests/test_playlist.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import requests
from utils import is_unique


# Test for basic playlist recommendation
def test_playlist_recommendation(env, bearer_token):
url = f"{env['API_URL']}/native/v1/recommendation/playlist"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {bearer_token}",
}
data = {}

response = requests.post(url, json=data, headers=headers)

assert response.status_code == 200
assert response.elapsed.total_seconds() < 10

json_response = response.json()
assert json_response is not None
assert isinstance(json_response, dict)
assert "playlist_recommended_offers" in json_response
assert isinstance(json_response["playlist_recommended_offers"], list)
assert len(json_response["playlist_recommended_offers"]) > 0


# Test playlist recommendation with geolocation (empty body)
def test_playlist_recommendation_geolocation(env, bearer_token):
url = f"{env['API_URL']}/native/v1/recommendation/playlist?longitude=2.3688874&latitude=48.8632553"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {bearer_token}",
}
data = {}

response = requests.post(url, json=data, headers=headers)

assert response.status_code == 200
assert response.elapsed.total_seconds() < 10

json_response = response.json()
assert json_response is not None
assert "playlist_recommended_offers" in json_response
assert isinstance(json_response["playlist_recommended_offers"], list)
assert len(json_response["playlist_recommended_offers"]) > 0


# Test playlist recommendation with unique offers check
def test_playlist_recommendation_unique_offer_ids(env, bearer_token):
url = f"{env['API_URL']}/native/v1/recommendation/playlist"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {bearer_token}",
}
data = {}

response = requests.post(url, json=data, headers=headers)

assert response.status_code == 200

json_response = response.json()
offer_ids = [offer["id"] for offer in json_response["playlist_recommended_offers"]]
assert is_unique(offer_ids)
31 changes: 31 additions & 0 deletions apps/recommendation/api/api_tests/test_similar_offer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import requests
from utils import is_unique


# Test for similar offers based on offer ID
def test_similar_offers(env):
url = f"{env['API_URL']}/native/v1/recommendation/similar_offers/{env['OFFER_ID']}"

response = requests.get(url)
print(url)
assert response.status_code == 200
assert response.elapsed.total_seconds() < 10

json_response = response.json()
assert "results" in json_response
assert isinstance(json_response["results"], list)
assert len(json_response["results"]) > 0


# Test for similar offers with geolocation
def test_similar_offers_geolocation(env):
url = f"{env['API_URL']}/native/v1/recommendation/similar_offers/{env['OFFER_ID']}?longitude=2.3688874&latitude=48.8632553"
print(url)
response = requests.get(url)

assert response.status_code == 200

json_response = response.json()
assert "results" in json_response
offer_ids = [offer["id"] for offer in json_response["results"]]
assert is_unique(offer_ids)
3 changes: 3 additions & 0 deletions apps/recommendation/api/api_tests/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
def is_unique(array):
"""Helper function to check if an array contains unique elements."""
return len(array) == len(set(array))
Loading

0 comments on commit ba0aec2

Please sign in to comment.