From 885c9786946337fe28034873fe58cfd9015efa37 Mon Sep 17 00:00:00 2001 From: Katrina Anderson <3422688+Trinaa@users.noreply.github.com> Date: Mon, 27 Jun 2022 12:51:45 -0400 Subject: [PATCH] test: Merge contile-integration-test repository into contile test: Merge contile-integration-test repository into contile * move contract-tests to new test-engineering directory * integrate contile-integration-test repository Co-authored-by: Ankita Shrivastava Co-authored-by: Ankita Shrivastava <62558650+ashrivastava-qa@users.noreply.github.com> Co-authored-by: Raphael Pierzina Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: JR Conlin Co-authored-by: jrconlin Co-authored-by: Nan Jiang --- .circleci/config.yml | 53 ++- .github/CODEOWNERS | 2 + .github/dependabot.yml | 20 + README.md | 4 +- test-engineering/.gitignore | 135 +++++++ test-engineering/contract-tests/.dockerignore | 13 + test-engineering/contract-tests/README.md | 59 +++ .../contract-tests/client/Dockerfile | 17 + .../contract-tests/client/LICENSE | 373 ++++++++++++++++++ .../contract-tests/client/README.md | 6 + .../contract-tests/client/dev-requirements.in | 7 + .../client/dev-requirements.txt | 44 +++ .../contract-tests/client/mypy.ini | 11 + .../contract-tests/client/requirements.in | 4 + .../contract-tests/client/requirements.txt | 38 ++ .../contract-tests/client/tests/conftest.py | 65 +++ .../contract-tests/client/tests/models.py | 63 +++ .../client/tests/test_contile.py | 57 +++ .../contract-tests/client/tox.ini | 39 ++ .../contract-tests}/docker-compose.204.yml | 0 .../docker-compose.init_error.yml | 0 .../contract-tests}/docker-compose.yml | 8 +- .../contract-tests/partner/Dockerfile | 41 ++ .../contract-tests/partner/LICENSE | 373 ++++++++++++++++++ .../contract-tests/partner/README.md | 71 ++++ .../contract-tests/partner/app/__init__.py | 3 + .../contract-tests/partner/app/main.py | 214 ++++++++++ .../contract-tests/partner/app/models.py | 40 ++ .../contract-tests/partner/app/responses.py | 84 ++++ .../partner/app/tests/__init__.py | 3 + .../partner/app/tests/conftest.py | 21 + .../partner/app/tests/responses.yml | 20 + .../app/tests/responses/DE/responses.yml | 56 +++ .../partner/app/tests/responses/US/NY.yml | 56 +++ .../app/tests/responses/US/responses.yml | 56 +++ .../partner/app/tests/responses/responses.yml | 87 ++++ .../partner/app/tests/test_app.py | 325 +++++++++++++++ .../partner/app/tests/test_responses.py | 147 +++++++ .../partner/config/gunicorn_conf.py | 18 + .../contract-tests/partner/config/logging.yml | 38 ++ .../partner/dev-requirements.in | 8 + .../partner/dev-requirements.txt | 68 ++++ .../contract-tests/partner/entrypoint.sh | 5 + .../contract-tests/partner/mypy.ini | 11 + .../contract-tests/partner/requirements.in | 4 + .../contract-tests/partner/requirements.txt | 41 ++ .../contract-tests/partner/tox.ini | 56 +++ .../contract-tests/sequence_diagram.png | Bin 0 -> 312221 bytes .../volumes/client/scenarios.yml | 0 .../volumes/client/scenarios_204.yml | 0 .../volumes/client/scenarios_init_error.yml | 0 .../volumes/contile/adm_settings.json | 0 .../contile/adm_settings_init_error.json | 0 .../volumes/partner/GB/responses.yml | 0 .../contract-tests}/volumes/partner/US/WA.yml | 0 .../volumes/partner/responses.yml | 0 56 files changed, 2847 insertions(+), 17 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/dependabot.yml create mode 100644 test-engineering/.gitignore create mode 100644 test-engineering/contract-tests/.dockerignore create mode 100644 test-engineering/contract-tests/README.md create mode 100644 test-engineering/contract-tests/client/Dockerfile create mode 100644 test-engineering/contract-tests/client/LICENSE create mode 100644 test-engineering/contract-tests/client/README.md create mode 100644 test-engineering/contract-tests/client/dev-requirements.in create mode 100644 test-engineering/contract-tests/client/dev-requirements.txt create mode 100644 test-engineering/contract-tests/client/mypy.ini create mode 100644 test-engineering/contract-tests/client/requirements.in create mode 100644 test-engineering/contract-tests/client/requirements.txt create mode 100644 test-engineering/contract-tests/client/tests/conftest.py create mode 100644 test-engineering/contract-tests/client/tests/models.py create mode 100644 test-engineering/contract-tests/client/tests/test_contile.py create mode 100644 test-engineering/contract-tests/client/tox.ini rename {contract-tests => test-engineering/contract-tests}/docker-compose.204.yml (100%) rename {contract-tests => test-engineering/contract-tests}/docker-compose.init_error.yml (100%) rename {contract-tests => test-engineering/contract-tests}/docker-compose.yml (94%) create mode 100644 test-engineering/contract-tests/partner/Dockerfile create mode 100644 test-engineering/contract-tests/partner/LICENSE create mode 100644 test-engineering/contract-tests/partner/README.md create mode 100644 test-engineering/contract-tests/partner/app/__init__.py create mode 100644 test-engineering/contract-tests/partner/app/main.py create mode 100644 test-engineering/contract-tests/partner/app/models.py create mode 100644 test-engineering/contract-tests/partner/app/responses.py create mode 100644 test-engineering/contract-tests/partner/app/tests/__init__.py create mode 100644 test-engineering/contract-tests/partner/app/tests/conftest.py create mode 100644 test-engineering/contract-tests/partner/app/tests/responses.yml create mode 100644 test-engineering/contract-tests/partner/app/tests/responses/DE/responses.yml create mode 100644 test-engineering/contract-tests/partner/app/tests/responses/US/NY.yml create mode 100644 test-engineering/contract-tests/partner/app/tests/responses/US/responses.yml create mode 100644 test-engineering/contract-tests/partner/app/tests/responses/responses.yml create mode 100644 test-engineering/contract-tests/partner/app/tests/test_app.py create mode 100644 test-engineering/contract-tests/partner/app/tests/test_responses.py create mode 100644 test-engineering/contract-tests/partner/config/gunicorn_conf.py create mode 100644 test-engineering/contract-tests/partner/config/logging.yml create mode 100644 test-engineering/contract-tests/partner/dev-requirements.in create mode 100644 test-engineering/contract-tests/partner/dev-requirements.txt create mode 100644 test-engineering/contract-tests/partner/entrypoint.sh create mode 100644 test-engineering/contract-tests/partner/mypy.ini create mode 100644 test-engineering/contract-tests/partner/requirements.in create mode 100644 test-engineering/contract-tests/partner/requirements.txt create mode 100644 test-engineering/contract-tests/partner/tox.ini create mode 100644 test-engineering/contract-tests/sequence_diagram.png rename {contract-tests => test-engineering/contract-tests}/volumes/client/scenarios.yml (100%) rename {contract-tests => test-engineering/contract-tests}/volumes/client/scenarios_204.yml (100%) rename {contract-tests => test-engineering/contract-tests}/volumes/client/scenarios_init_error.yml (100%) rename {contract-tests => test-engineering/contract-tests}/volumes/contile/adm_settings.json (100%) rename {contract-tests => test-engineering/contract-tests}/volumes/contile/adm_settings_init_error.json (100%) rename {contract-tests => test-engineering/contract-tests}/volumes/partner/GB/responses.yml (100%) rename {contract-tests => test-engineering/contract-tests}/volumes/partner/US/WA.yml (100%) rename {contract-tests => test-engineering/contract-tests}/volumes/partner/responses.yml (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7690c55a..35590fdf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -190,7 +190,31 @@ jobs: else echo "Not pushing to dockerhub for tag=${CIRCLE_TAG} branch=${CIRCLE_BRANCH}" fi - contile-contract-tests: + + contract-test-checks: + docker: + - image: python:3.8 + working_directory: "~/contile/test-engineering/contract-tests" + steps: + - checkout: + path: ~/contile/ + - run: + name: Setup tox + command: | + python -m pip install --upgrade pip + python -m pip install tox + - run: + name: Run tox checks for client + working_directory: client + command: | + tox + - run: + name: Run tox checks for partner + working_directory: partner + command: | + tox + + contract-tests: machine: docker_layer_caching: true image: ubuntu-2004:202101-01 # Ubuntu 20.04, Docker v20.10.2, Docker Compose v1.28.2 @@ -207,28 +231,32 @@ jobs: command: | echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin - run: - name: Run contract tests + name: Build client and partner images command: | docker-compose --version docker-compose \ - -f contract-tests/docker-compose.yml \ + -f test-engineering/contract-tests/docker-compose.yml \ + build client partner + - run: + name: Run contract tests + command: | + docker-compose \ + -f test-engineering/contract-tests/docker-compose.yml \ up --abort-on-container-exit --force-recreate - run: name: 'Run "204" contract tests' command: | - docker-compose --version docker-compose \ - -f contract-tests/docker-compose.yml \ - -f contract-tests/docker-compose.204.yml \ + -f test-engineering/contract-tests/docker-compose.yml \ + -f test-engineering/contract-tests/docker-compose.204.yml \ up --abort-on-container-exit --force-recreate - run: name: 'Run "init_error" contract tests' command: | - docker-compose --version set +e # We need this so that the run doesn't exit after docker-compose docker-compose \ - -f contract-tests/docker-compose.yml \ - -f contract-tests/docker-compose.init_error.yml \ + -f test-engineering/contract-tests/docker-compose.yml \ + -f test-engineering/contract-tests/docker-compose.init_error.yml \ up --abort-on-container-exit --exit-code contile --force-recreate contile_exit_code=$? if [ "${contile_exit_code}" -eq 0 ]; then @@ -257,15 +285,16 @@ workflows: only: /.*/ requires: - build - - contile-contract-tests: - name: contile-contract-tests + - contract-test-checks + - contract-tests: requires: - build + - contract-test-checks - deploy: requires: - build - test - - contile-contract-tests + - contract-tests filters: tags: only: /.*/ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..272971c9 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +* @mozilla-services/context-services +test-engineering/* @mozilla-services/context-services-test-eng diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..37a00194 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,20 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directory: "test-engineering/contract-tests/partner/" + schedule: + interval: "weekly" + day: "friday" + labels: + - "dependencies" + - "python" + open-pull-requests-limit: 5 + - package-ecosystem: "pip" + directory: "test-engineering/contract-tests/client/" + schedule: + interval: "weekly" + day: "friday" + labels: + - "dependencies" + - "python" + open-pull-requests-limit: 5 diff --git a/README.md b/README.md index 930d0cee..907295d6 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,8 @@ GOOGLE_APPLICATION_CREDENTIALS={path to your credential.json file} \ #### Contract tests Contract tests are currently run using Docker images. This is so that they can be run as -part of our automated continuous integration (CI) testing. Running these tests outside of -Docker is possible, but requires some additional work. See [Contile Integration Tests](https://github.com/mozilla-services/contile-integration-tests) for details. +part of our automated continuous integration (CI) testing. +See the dedicated [contract-tests README](test-engineering/contract-tests/README.md) for details. ## Why "Contile"? diff --git a/test-engineering/.gitignore b/test-engineering/.gitignore new file mode 100644 index 00000000..2831c0e7 --- /dev/null +++ b/test-engineering/.gitignore @@ -0,0 +1,135 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# VS Code +.vscode/ + +# JetBrains +.idea/ diff --git a/test-engineering/contract-tests/.dockerignore b/test-engineering/contract-tests/.dockerignore new file mode 100644 index 00000000..97ad8a62 --- /dev/null +++ b/test-engineering/contract-tests/.dockerignore @@ -0,0 +1,13 @@ +**/*.py[cod] +**/__pycache__ +**/.pytest_cache +*.egg +*.egg-info +*.log +.cache +.git +.tox +.vscode +build +dist +pip-log.txt diff --git a/test-engineering/contract-tests/README.md b/test-engineering/contract-tests/README.md new file mode 100644 index 00000000..af5e1509 --- /dev/null +++ b/test-engineering/contract-tests/README.md @@ -0,0 +1,59 @@ +# contile-contract-tests + +This directory contains the automated contract test suite for the Mozilla Tile +Service (MTS). Passing contract tests are a prerequisite for moving to the next +phase in the rollout plan. The contract test framework was originally developed +in isolation, see [contile-integration-tests][contract-test-repo]. + +## Overview + +The contract test suite is designed to be set up as a `docker-compose` CI +workflow. The following sections as well as the sequence diagram below describe +the individual components of the suite. + +![Sequence diagram of the integration tests][sequence_diagram] + +To run the contract tests locally, execute the following from the repository root: + +```text +docker compose \ +-f test-engineering\contract-tests\docker-compose.yml \ +up --abort-on-container-exit --build +``` + +### partner + +The `partner` directory contains a Python-based web service. The HTTP API of +this service implements the API specification of the partner API that MTS +connects to when requesting tiles to pass along to Firefox for display. + +When a client sends a request to the MTS, information about the client's form +factor and OS family are parsed from the `User-Agent` header. Then, when the MTS +sends a request to the partner API the form factor and OS family information is +included in the query parameters. We leverage this behavior to map requests from +a client to specific responses from the partner API. We can control not only the +response content, but also the response status code, response headers and even +delay the response for a period of time, which allows us to effectively test the +MTS. + +### client + +The `client` directory contains a Python-based test framework for the +contract tests. The HTTP client used in the framework requests tiles from the +MTS and performs checks against the responses. The framework implements response +models for the MTS API. + +### volumes + +The `volumes` directory contains subdirectories which will be mounted as +volumes into the Docker containers used in the contract test suite: + +- the `volumes/partner` directory contains a YML file which defines every +response that the API returns keyed by form-factor and then os-family +- the `volumes/contile` directory contains files that need to be provided to a +MTS Docker container such as a partner settings file +- the `volumes/client` directory contains a YML file which defines every test +scenario that the contract test suite will run + +[contract-test-repo]: https://github.com/mozilla-services/contile-integration-tests +[sequence_diagram]: sequence_diagram.png diff --git a/test-engineering/contract-tests/client/Dockerfile b/test-engineering/contract-tests/client/Dockerfile new file mode 100644 index 00000000..68d790f0 --- /dev/null +++ b/test-engineering/contract-tests/client/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.8-slim-buster + +LABEL maintainer "Raphael Pierzina " + +ENV PYTHON_VENV=/venv +RUN python -m venv ${PYTHON_VENV} +ENV PATH="${PYTHON_VENV}/bin:${PATH}" + +RUN python -m pip install --upgrade pip + +COPY requirements.txt /tmp/requirements.txt +RUN python -m pip install -r /tmp/requirements.txt + +COPY . /usr/src/client +WORKDIR /usr/src/client + +ENTRYPOINT [ "pytest" ] diff --git a/test-engineering/contract-tests/client/LICENSE b/test-engineering/contract-tests/client/LICENSE new file mode 100644 index 00000000..a612ad98 --- /dev/null +++ b/test-engineering/contract-tests/client/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/test-engineering/contract-tests/client/README.md b/test-engineering/contract-tests/client/README.md new file mode 100644 index 00000000..0ec83334 --- /dev/null +++ b/test-engineering/contract-tests/client/README.md @@ -0,0 +1,6 @@ +# client + +This directory contains a Python-based test framework for the integration +tests. The HTTP client used in the framework requests tiles from the MTS and +performs checks against the responses. The framework implements response models +for the MTS API. diff --git a/test-engineering/contract-tests/client/dev-requirements.in b/test-engineering/contract-tests/client/dev-requirements.in new file mode 100644 index 00000000..3814900b --- /dev/null +++ b/test-engineering/contract-tests/client/dev-requirements.in @@ -0,0 +1,7 @@ +-c requirements.txt +black +flake8 +isort +mypy +types-PyYAML +types-requests diff --git a/test-engineering/contract-tests/client/dev-requirements.txt b/test-engineering/contract-tests/client/dev-requirements.txt new file mode 100644 index 00000000..f3d69b0e --- /dev/null +++ b/test-engineering/contract-tests/client/dev-requirements.txt @@ -0,0 +1,44 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile dev-requirements.in +# +black==22.3.0 + # via -r dev-requirements.in +click==8.0.1 + # via black +flake8==4.0.1 + # via -r dev-requirements.in +isort==5.10.1 + # via -r dev-requirements.in +mccabe==0.6.1 + # via flake8 +mypy==0.942 + # via -r dev-requirements.in +mypy-extensions==0.4.3 + # via + # black + # mypy +pathspec==0.9.0 + # via black +platformdirs==2.4.0 + # via black +pycodestyle==2.8.0 + # via flake8 +pyflakes==2.4.0 + # via flake8 +tomli==1.2.1 + # via + # black + # mypy +types-pyyaml==6.0.5 + # via -r dev-requirements.in +types-requests==2.27.16 + # via -r dev-requirements.in +types-urllib3==1.26.7 + # via types-requests +typing-extensions==3.10.0.0 + # via + # -c requirements.txt + # mypy diff --git a/test-engineering/contract-tests/client/mypy.ini b/test-engineering/contract-tests/client/mypy.ini new file mode 100644 index 00000000..e4827b42 --- /dev/null +++ b/test-engineering/contract-tests/client/mypy.ini @@ -0,0 +1,11 @@ +[mypy] +python_version=3.8 +follow_imports=normal +ignore_missing_imports=True +disallow_untyped_calls=True +warn_return_any=True +strict_optional=True +warn_no_return=True +warn_redundant_casts=True +warn_unused_ignores=True +plugins = pydantic.mypy diff --git a/test-engineering/contract-tests/client/requirements.in b/test-engineering/contract-tests/client/requirements.in new file mode 100644 index 00000000..3fe4ec2d --- /dev/null +++ b/test-engineering/contract-tests/client/requirements.in @@ -0,0 +1,4 @@ +pydantic +pytest +pyyaml +requests diff --git a/test-engineering/contract-tests/client/requirements.txt b/test-engineering/contract-tests/client/requirements.txt new file mode 100644 index 00000000..28bf6d67 --- /dev/null +++ b/test-engineering/contract-tests/client/requirements.txt @@ -0,0 +1,38 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile requirements.in +# +attrs==21.2.0 + # via pytest +certifi==2021.5.30 + # via requests +charset-normalizer==2.0.7 + # via requests +idna==2.10 + # via requests +iniconfig==1.1.1 + # via pytest +packaging==20.9 + # via pytest +pluggy==0.13.1 + # via pytest +py==1.10.0 + # via pytest +pydantic==1.9.0 + # via -r requirements.in +pyparsing==2.4.7 + # via packaging +pytest==6.2.5 + # via -r requirements.in +pyyaml==6.0 + # via -r requirements.in +requests==2.27.1 + # via -r requirements.in +toml==0.10.2 + # via pytest +typing-extensions==3.10.0.0 + # via pydantic +urllib3==1.26.5 + # via requests diff --git a/test-engineering/contract-tests/client/tests/conftest.py b/test-engineering/contract-tests/client/tests/conftest.py new file mode 100644 index 00000000..ef026699 --- /dev/null +++ b/test-engineering/contract-tests/client/tests/conftest.py @@ -0,0 +1,65 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +import pathlib + +import pytest +import yaml +from models import Scenario, Tiles + + +def pytest_configure(config): + """Load test scenarios from file.""" + + scenarios_file = os.environ["SCENARIOS_FILE"] + + with pathlib.Path(scenarios_file).open() as f: + loaded_scenarios = yaml.safe_load(f) + + config.contile_scenarios = [ + Scenario(**scenario) for scenario in loaded_scenarios["scenarios"] + ] + + # Check that all 200 OK responses in test scenarios contain correct tiles + # information and FastAPI model instances were created for them. + for scenario in config.contile_scenarios: + for i, step in enumerate(scenario.steps): + + if step.response.status_code != 200: + continue + + if not isinstance(step.response.content, Tiles): + raise pytest.UsageError( + f"Failed to create Tiles model for '200 OK' response " + f"content in step {i} of scenario '{scenario.name}'" + ) + + +def pytest_generate_tests(metafunc): + """Generate tests from the loaded test scenarios.""" + + ids = [] + argvalues = [] + + for scenario in metafunc.config.contile_scenarios: + ids.append(scenario.name) + argvalues.append([scenario.steps]) + + metafunc.parametrize(["steps"], argvalues, ids=ids) + + +def pytest_addoption(parser): + """Define custom CLI options.""" + contile_group = parser.getgroup("contile") + contile_group.addoption( + "--contile-url", + action="store", + dest="contile_url", + help="Contile endpoint URL", + metavar="CONTILE_URL", + default=os.environ.get("CONTILE_URL"), + type=str, + required=False, + ) diff --git a/test-engineering/contract-tests/client/tests/models.py b/test-engineering/contract-tests/client/tests/models.py new file mode 100644 index 00000000..907b9a0d --- /dev/null +++ b/test-engineering/contract-tests/client/tests/models.py @@ -0,0 +1,63 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from typing import Any, List, Optional, Union + +from pydantic import BaseModel, Extra + + +class Header(BaseModel): + """Class that holds information about a HTTP header.""" + + name: str + value: str + + +class Request(BaseModel): + """Class that holds information about a HTTP request to Contile.""" + + method: str + path: str + headers: List[Header] = [] + + +class Tile(BaseModel, extra=Extra.allow): + """Class that holds information about a Tile returned by Contile.""" + + id: int + name: str + click_url: str + image_url: str + image_size: Optional[int] + impression_url: str + url: str + + +class Tiles(BaseModel): + """Class that contains a list of Tiles returned by Contile.""" + + tiles: List[Tile] + + +class Response(BaseModel): + """Class that holds information about a HTTP response from Contile.""" + + status_code: int + content: Union[Tiles, Any] + headers: List[Header] = [] + + +class Step(BaseModel): + """Class that holds information about a step in a test scenario.""" + + request: Request + response: Response + + +class Scenario(BaseModel): + """Class that holds information about a specific test scenario.""" + + name: str + description: str + steps: List[Step] diff --git a/test-engineering/contract-tests/client/tests/test_contile.py b/test-engineering/contract-tests/client/tests/test_contile.py new file mode 100644 index 00000000..b002d27f --- /dev/null +++ b/test-engineering/contract-tests/client/tests/test_contile.py @@ -0,0 +1,57 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +from typing import List + +import pytest +import requests +from models import Step + + +@pytest.fixture(name="contile_host") +def fixture_contile_host(request): + """Read the contile host from the pytest config.""" + + return request.config.option.contile_url + + +def test_contile(contile_host: str, steps: List[Step]): + """Test for requesting tiles from Contile.""" + + for step in steps: + # Each step in a test scenario consists of a request and a response. + # Use the parameters to perform the request and verify the response. + + method = step.request.method + url = f"{contile_host}{step.request.path}" + headers = {header.name: header.value for header in step.request.headers} + + r = requests.request(method, url, headers=headers) + + error_message = ( + f"Expected status code {step.response.status_code},\n" + f"but the status code in the response from Contile is {r.status_code}.\n" + f"The response content is '{r.text}'." + ) + + assert r.status_code == step.response.status_code, error_message + + if r.status_code == 200: + # If the response status code is 200 OK, load the response content + # into a Python dict and generate a dict from the response model + assert r.json() == step.response.content.dict() + continue + + if r.status_code == 204: + # If the response status code is 204 No Content, load the response content + # as text and compare against the value in the response model. This + # should be an empty string. + assert r.text == step.response.content + continue + + # If the request to Contile was not successful, load the response + # content into a Python dict and compare against the value in the + # response model, which is expected to be the Contile error code. + assert r.json() == step.response.content diff --git a/test-engineering/contract-tests/client/tox.ini b/test-engineering/contract-tests/client/tox.ini new file mode 100644 index 00000000..97ad67dd --- /dev/null +++ b/test-engineering/contract-tests/client/tox.ini @@ -0,0 +1,39 @@ +[tox] +envlist = black, flake8, mypy +isolated_build = False + +[testenv] +# Use Python 3.8 for all test environments +basepython = python3.8 + +# The client is not set up as a Python package +skip_install = True + +# We use pip-tools to install compatible packages +deps = pip-tools + +[testenv:black] +commands_pre = + # Install the pinned development requirements + pip-sync {toxinidir}/dev-requirements.txt +commands = + black --check tests/ + +[testenv:flake8] +commands_pre = + # Install the pinned development requirements + pip-sync {toxinidir}/dev-requirements.txt +commands = + flake8 + +[flake8] +max-line-length = 88 + +[testenv:mypy] +commands_pre = + # Install the pinned client and development requirements + pip-sync {toxinidir}/requirements.txt {toxinidir}/dev-requirements.txt + # Verify installed packages have compatible dependencies + pip check -v +commands = + mypy tests/ diff --git a/contract-tests/docker-compose.204.yml b/test-engineering/contract-tests/docker-compose.204.yml similarity index 100% rename from contract-tests/docker-compose.204.yml rename to test-engineering/contract-tests/docker-compose.204.yml diff --git a/contract-tests/docker-compose.init_error.yml b/test-engineering/contract-tests/docker-compose.init_error.yml similarity index 100% rename from contract-tests/docker-compose.init_error.yml rename to test-engineering/contract-tests/docker-compose.init_error.yml diff --git a/contract-tests/docker-compose.yml b/test-engineering/contract-tests/docker-compose.yml similarity index 94% rename from contract-tests/docker-compose.yml rename to test-engineering/contract-tests/docker-compose.yml index d6a7e9a2..763c3379 100644 --- a/contract-tests/docker-compose.yml +++ b/test-engineering/contract-tests/docker-compose.yml @@ -1,7 +1,8 @@ version: "3" services: partner: - image: mozilla/contile-integration-tests-partner:22.1.2 + image: partner + build: partner container_name: partner environment: PORT: 5000 @@ -43,7 +44,7 @@ services: - "8000" volumes: - ./volumes/contile:/tmp/contile - - ../mmdb:/tmp/mmdb + - ../../mmdb:/tmp/mmdb ## Override the entrypoint to report the IP address, then try ## running Contile this can be useful to debug internal ## networking issues as well as externally connect to contile. @@ -52,7 +53,8 @@ services: #entrypoint: > # /bin/sh -c "hostname -I && bin/contile" client: - image: mozilla/contile-integration-tests-client:22.1.2 + image: client + build: client container_name: client depends_on: - partner diff --git a/test-engineering/contract-tests/partner/Dockerfile b/test-engineering/contract-tests/partner/Dockerfile new file mode 100644 index 00000000..3c64acd6 --- /dev/null +++ b/test-engineering/contract-tests/partner/Dockerfile @@ -0,0 +1,41 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +FROM python:3.8-slim + +LABEL maintainer "Raphael Pierzina " + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH=/app \ + PORT=8000 + +# see https://github.com/mozilla-services/Dockerflow +# add a non-privileged user for running the application +RUN groupadd --gid 10001 app && \ + useradd -g app --uid 10001 --shell /usr/sbin/nologin --create-home --home-dir /app app + +WORKDIR /app + +ENV PYTHON_VENV=venv +RUN python -m venv ${PYTHON_VENV} +ENV PATH="${PYTHON_VENV}/bin:${PATH}" + +RUN python -m pip install --upgrade pip + +COPY requirements.txt /tmp/requirements.txt +RUN python -m pip install -r /tmp/requirements.txt + +COPY config/ config/ + +COPY entrypoint.sh entrypoint.sh +RUN chmod +x entrypoint.sh + +COPY app/ /app/ + +RUN chown app:app /app +USER app + +EXPOSE ${PORT} +ENTRYPOINT [ "./entrypoint.sh" ] +CMD ["gunicorn","-c", "config/gunicorn_conf.py", "-k", "uvicorn.workers.UvicornWorker", "main:app"] diff --git a/test-engineering/contract-tests/partner/LICENSE b/test-engineering/contract-tests/partner/LICENSE new file mode 100644 index 00000000..a612ad98 --- /dev/null +++ b/test-engineering/contract-tests/partner/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/test-engineering/contract-tests/partner/README.md b/test-engineering/contract-tests/partner/README.md new file mode 100644 index 00000000..53e0f37a --- /dev/null +++ b/test-engineering/contract-tests/partner/README.md @@ -0,0 +1,71 @@ +# partner + +This directory contains a Python-based web service. The HTTP API of this service +implements the API specification of the partner API that MTS connects to when +requesting tiles to pass along to Firefox for display. + +## Setup + +Install all requirements via [pip-tools][pip-tools]: + +```text +pip-sync requirements.txt dev-requirements.txt +``` + +## Code checks and tests + +With requirements installed run the code checks and test via [tox][tox]: + +```text +tox +``` + +See the tox configuration in the `tox.ini` for the list of environments this +will run. + +## Running the service + +You can run the service using `docker compose` from the root directory: + +```text +docker compose run -p 5000:5000 partner +``` + +## Tiles API + +Example request: + +```text +curl \ + -X 'GET' \ + -H 'accept: application/json' \ + 'http://0.0.0.0:5000/tilesp?partner=demofeed&sub1=123456789&sub2=placement1&country-code=US®ion-code=NY&form-factor=desktop&os-family=macos&v=1.0&out=json&results=2' +``` + +Example response body: + +```json +{ + "tiles": [ + { + "id": 12346, + "name": "Example COM", + "click_url": "https://example.com/desktop_macos?version=16.0.0", + "image_url": "https://example.com/desktop_macos01.jpg", + "impression_url": "https://example.com/desktop_macos?id=0001", + "advertiser_url": "https://www.example.com/desktop_macos" + }, + { + "id": 56790, + "name": "Example ORG", + "click_url": "https://example.org/desktop_macos?version=16.0.0", + "image_url": "https://example.org/desktop_macos02.jpg", + "impression_url": "https://example.org/desktop_macos?id=0002", + "advertiser_url": "https://www.example.org/desktop_macos" + } + ] +} +``` + +[tox]: https://pypi.org/project/tox/ +[pip-tools]: https://pypi.org/project/pip-tools/ diff --git a/test-engineering/contract-tests/partner/app/__init__.py b/test-engineering/contract-tests/partner/app/__init__.py new file mode 100644 index 00000000..6fbe8159 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/__init__.py @@ -0,0 +1,3 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/test-engineering/contract-tests/partner/app/main.py b/test-engineering/contract-tests/partner/app/main.py new file mode 100644 index 00000000..0f4b7bdb --- /dev/null +++ b/test-engineering/contract-tests/partner/app/main.py @@ -0,0 +1,214 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import asyncio +import enum +import json +import logging +import os +import pathlib +import sys +from typing import Dict, List + +from fastapi import FastAPI, Query, Request, Response, status +from fastapi.encoders import jsonable_encoder +from fastapi.exceptions import RequestValidationError +from fastapi.responses import JSONResponse +from models import Tiles +from responses import LoaderConfig, load_responses + +logger = logging.getLogger("partner") + +version = f"{sys.version_info.major}.{sys.version_info.minor}" + +RESPONSES_DIR = pathlib.Path(os.environ["RESPONSES_DIR"]) + +scenarios_files = [p for p in RESPONSES_DIR.glob("**/*.yml")] + +if not scenarios_files: + raise RuntimeError( + f"RESPONSES_DIR '{RESPONSES_DIR}' does not contain any YML files" + ) + +LOADER_CONFIG = LoaderConfig(RESPONSES_DIR) + +app = FastAPI() + +# This is only included for client errors such as invalid query parameter values +# or unknown query parameters. +BODY_FROM_API_SPEC = { + "status": {"code": "103", "text": "Invalid input"}, + "count": "0", + "response": "1", +} + + +@app.exception_handler(RequestValidationError) +async def validation_exception_handler( + request: Request, exc: RequestValidationError +) -> Response: + """Custom validation exception handler that returns a 400 Bad Request. + + This is required to match the partner API implementation. + """ + + # Include the example response body from the API spec in the response in + # case contile is processing that information internally. Return the actual + # validation error from FastAPI under the key "test". + return JSONResponse( + status_code=status.HTTP_400_BAD_REQUEST, + content=jsonable_encoder( + {"test": {"detail": exc.errors(), "body": exc.body}, **BODY_FROM_API_SPEC} + ), + ) + + +@app.get("/") +async def read_root(): + message = ( + f"Hello world! From FastAPI running on Uvicorn " + f"with Gunicorn. Using Python {version}" + ) + return {"message": message} + + +# Make sure to update this when query parameters for `read_tilesp` change +ACCEPTED_QUERY_PARAMS = [ + "partner", + "sub1", + "sub2", + "country-code", + "region-code", + "dma-code", + "form-factor", + "os-family", + "v", + "out", + "results", +] + + +class Endpoint(str, enum.Enum): + """Path parameters with pre-defined values for the supported endpoints.""" + + mobile: str = "mobile" + desktop: str = "desktop" + + +# Map from supported API endpoint path to accepted form-factor query parameter +# values. Example environment variables: 'phone,tablet' or 'desktop'. +FORM_FACTORS: Dict[Endpoint, List[str]] = { + Endpoint.mobile: [ + form_factor.strip().lower() + for form_factor in os.environ["ACCEPTED_MOBILE_FORM_FACTORS"].split(",") + ], + Endpoint.desktop: [ + form_factor.strip().lower() + for form_factor in os.environ["ACCEPTED_DESKTOP_FORM_FACTORS"].split(",") + ], +} + + +@app.get("/tilesp/{endpoint}", response_model=Tiles, status_code=200) +async def read_tilesp( + request: Request, + response: Response, + endpoint: Endpoint, + partner: str = Query(..., example="demofeed"), + sub1: str = Query(..., example="123456789"), + sub2: str = Query( + ..., example="placement1", max_length=128, regex="^[a-zA-Z0-9]+$" + ), + # country_code parameter follows ISO-3166 alpha-2 standard and validations + # (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) + country_code: str = Query( + ..., alias="country-code", example="US", length=2, regex="^[A-Z]{2}$" + ), + # region_code parameter follows ISO-3166-2 standard and validations + # https://en.wikipedia.org/wiki/ISO_3166-2 + region_code: str = Query( + ..., alias="region-code", example="NY", regex="^([A-Z0-9]{1,3})?$" + ), + # dma_code parameter represents a Designated Marketing Area code in the US. + dma_code: str = Query(..., alias="dma-code", example="532", regex="^([0-9]+)?$"), + form_factor: str = Query(..., alias="form-factor", example="desktop"), + os_family: str = Query(..., alias="os-family", example="macos"), + v: str = Query(..., example="1.0"), + out: str = Query("json", example="json"), + results: int = Query(1, example=2), +): + """Endpoint for requests from Contile.""" + + unknown_query_params: List[str] = [ + param for param in request.query_params if param not in ACCEPTED_QUERY_PARAMS + ] + + if unknown_query_params: + logger.error( + "received unexpected query parameters from Contile: %s", + unknown_query_params, + ) + + return JSONResponse( + status_code=status.HTTP_400_BAD_REQUEST, + content=jsonable_encoder( + { + "test": {"unexpected query parameter": unknown_query_params}, + **BODY_FROM_API_SPEC, + } + ), + ) + + if form_factor not in FORM_FACTORS[endpoint]: + logger.error("received form-factor '%s' on %s API", form_factor, endpoint.name) + + return JSONResponse( + status_code=status.HTTP_400_BAD_REQUEST, + content=jsonable_encoder( + { + "test": { + f"invalid form-factor for {endpoint.name} API": form_factor + }, + **BODY_FROM_API_SPEC, + } + ), + ) + + # Load responses from the responses.yml file for the given country_code and + # region_code. If that fails and the fallback behavior fails as well, this + # will raise an Exception resulting in a 500 Internal Server Error + responses_from_file = load_responses( + config=LOADER_CONFIG, country_code=country_code, region_code=region_code + ) + + # Read the response for the given form_factor and os_family + response_from_file = responses_from_file[form_factor][os_family] + + status_code = response_from_file.status_code + content = response_from_file.content + delay = response_from_file.delay + headers = {header.name: header.value for header in response_from_file.headers} + + if delay: + # Add an artificual delay to the handler + logger.debug("response is delayed by %s seconds", delay) + await asyncio.sleep(delay) + + logger.debug("response status_code: %s", status_code) + logger.debug("response headers %s", json.dumps(headers)) + logger.debug( + "response content: %s", + json.dumps(content, default=jsonable_encoder), + ) + + if status_code == status.HTTP_500_INTERNAL_SERVER_ERROR: + raise RuntimeError("Something went wrong") + + # Use this to trigger BadAdmResponse errors in Contile + if not isinstance(content, Tiles): + return JSONResponse(content=content, headers=headers) + + response.headers.update(headers) + response.status_code = status_code + return content diff --git a/test-engineering/contract-tests/partner/app/models.py b/test-engineering/contract-tests/partner/app/models.py new file mode 100644 index 00000000..6108b891 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/models.py @@ -0,0 +1,40 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from typing import Any, List, Union + +from pydantic import BaseModel + + +class Tile(BaseModel): + """Model for a tile returned to Contile.""" + + id: int + name: str + click_url: str + image_url: str + impression_url: str + advertiser_url: str + + +class Tiles(BaseModel): + """Model for a list of tiles returned to Contile.""" + + tiles: List[Tile] + + +class Header(BaseModel): + """Model that represents a HTTP header.""" + + name: str + value: str + + +class ResponseFromFile(BaseModel): + """Model that represents a Response as defined in responses.yml.""" + + status_code: int + headers: List[Header] + content: Union[Tiles, Any] + delay: float = 0.0 diff --git a/test-engineering/contract-tests/partner/app/responses.py b/test-engineering/contract-tests/partner/app/responses.py new file mode 100644 index 00000000..c3c81668 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/responses.py @@ -0,0 +1,84 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import dataclasses +import functools +import logging +from pathlib import Path +from typing import Dict + +import yaml +from models import ResponseFromFile + +logger = logging.getLogger("partner") + + +# Define type aliases for the functions in this module +FormFactor = str +OSFamily = str +ResponsesFromFile = Dict[FormFactor, Dict[OSFamily, ResponseFromFile]] + + +@dataclasses.dataclass(eq=True, frozen=True) +class LoaderConfig: + """Configuration options for the responses.yml file loader.""" + + responses_dir: Path + default_filename: str = "responses" + + +def load_responses_from_file(*, config: LoaderConfig, file: Path) -> ResponsesFromFile: + """Load responses from the given YAML file.""" + + logger.debug("load responses from %s", file.relative_to(config.responses_dir)) + + with file.open() as f: + responses_yml = yaml.safe_load(f) + + return { + form_factor: { + os_family: ResponseFromFile(**response) + for os_family, response in os_families.items() + } + for form_factor, os_families in responses_yml.items() + } + + +@functools.lru_cache(maxsize=None) +def load_responses( + *, config: LoaderConfig, country_code: str, region_code: str +) -> ResponsesFromFile: + """Load responses for the given country_code and region_code combination.""" + + logger.debug("load responses using config %s", config) + logger.debug( + "load responses for country_code '%s' and region_code '%s'", + country_code, + region_code, + ) + + country_dir = config.responses_dir / country_code + + if region_code: + # The region_code value is not an empty string, for example: "NY" + responses_file = country_dir / f"{region_code}.yml" + + # If there's a responses file for the given country_code and region_code + # combination load the responses from that file. Do not catch + # exceptions, because we need those to bubble up. + if responses_file.exists(): + return load_responses_from_file(config=config, file=responses_file) + + # If the region_code is an empty string or there's no responses file for the + # given region_code, load the default responses file for the country + responses_file = country_dir / f"{config.default_filename}.yml" + + if responses_file.exists(): + # Load default responses for the given country, if the file exists + return load_responses_from_file(config=config, file=responses_file) + + # Load default responses + return load_responses_from_file( + config=config, file=config.responses_dir / f"{config.default_filename}.yml" + ) diff --git a/test-engineering/contract-tests/partner/app/tests/__init__.py b/test-engineering/contract-tests/partner/app/tests/__init__.py new file mode 100644 index 00000000..6fbe8159 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/__init__.py @@ -0,0 +1,3 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/test-engineering/contract-tests/partner/app/tests/conftest.py b/test-engineering/contract-tests/partner/app/tests/conftest.py new file mode 100644 index 00000000..09d86a6b --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/conftest.py @@ -0,0 +1,21 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +import sys + +import pytest +from fastapi.testclient import TestClient + +from ..main import app + + +@pytest.fixture(name="version") +def fixture_version() -> str: + return f"{sys.version_info.major}.{sys.version_info.minor}" + + +@pytest.fixture(name="client") +def fixture_client() -> TestClient: + return TestClient(app) diff --git a/test-engineering/contract-tests/partner/app/tests/responses.yml b/test-engineering/contract-tests/partner/app/tests/responses.yml new file mode 100644 index 00000000..9388e4b0 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/responses.yml @@ -0,0 +1,20 @@ +# This file contains all partner responses for the /tilesp endpoint. +# We use form-factor and os-family to determine which respond to send to Contile. +desktop: + macos: + status_code: 200 + headers: [] + content: + tiles: + - id: 12346 + name: 'Example COM' + click_url: 'https://example.com/desktop_macos?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_macos01.jpg' + impression_url: 'https://example.com/desktop_macos?id=0001' + advertiser_url: 'https://www.example.com/desktop_macos' + - id: 56790 + name: 'Example ORG' + click_url: 'https://example.org/desktop_macos?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_macos02.jpg' + impression_url: 'https://example.org/desktop_macos?id=0002' + advertiser_url: 'https://www.example.org/desktop_macos' diff --git a/test-engineering/contract-tests/partner/app/tests/responses/DE/responses.yml b/test-engineering/contract-tests/partner/app/tests/responses/DE/responses.yml new file mode 100644 index 00000000..51d8d061 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/responses/DE/responses.yml @@ -0,0 +1,56 @@ +# This file contains all partner responses for the /tilesp API endpoint. +# We use form-factor and os-family to determine which response to send to Contile. +desktop: + windows: + status_code: 200 + headers: [] + content: + tiles: + - id: 12345 + name: 'Example COM' + click_url: 'https://example.com/desktop_windows_de?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_windows_de01.jpg' + impression_url: 'https://example.com/desktop_windows_de?id=0001' + advertiser_url: 'https://www.example.com/desktop_windows_de' + - id: 56789 + name: 'Example ORG' + click_url: 'https://example.org/desktop_windows_de?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_windows_de02.jpg' + impression_url: 'https://example.org/desktop_windows_de?id=0002' + advertiser_url: 'https://www.example.org/desktop_windows_de' + + macos: + status_code: 200 + headers: [] + content: + tiles: + - id: 12346 + name: 'Example COM' + click_url: 'https://example.com/desktop_macos_de?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_macos_de01.jpg' + impression_url: 'https://example.com/desktop_macos_de?id=0001' + advertiser_url: 'https://www.example.com/desktop_macos_de' + - id: 56790 + name: 'Example ORG' + click_url: 'https://example.org/desktop_macos_de?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_macos_de02.jpg' + impression_url: 'https://example.org/desktop_macos_de?id=0002' + advertiser_url: 'https://www.example.org/desktop_macos_de' + + linux: + status_code: 200 + headers: [] + content: + tiles: + - id: 12347 + name: 'Example COM' + click_url: 'https://example.com/desktop_linux_de?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_linux_de01.jpg' + impression_url: 'https://example.com/desktop_linux_de?id=0001' + advertiser_url: 'https://www.example.com/desktop_linux_de' + - id: 56791 + name: 'Example ORG' + click_url: 'https://example.org/desktop_linux_de?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_linux_de02.jpg' + impression_url: 'https://example.org/desktop_linux_de?id=0002' + advertiser_url: 'https://www.example.org/desktop_linux_de' diff --git a/test-engineering/contract-tests/partner/app/tests/responses/US/NY.yml b/test-engineering/contract-tests/partner/app/tests/responses/US/NY.yml new file mode 100644 index 00000000..35aea4f8 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/responses/US/NY.yml @@ -0,0 +1,56 @@ +# This file contains all partner responses for the /tilesp API endpoint. +# We use form-factor and os-family to determine which response to send to Contile. +desktop: + windows: + status_code: 200 + headers: [] + content: + tiles: + - id: 12345 + name: 'Example COM' + click_url: 'https://example.com/desktop_windows_us_ny?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_windows_us_ny01.jpg' + impression_url: 'https://example.com/desktop_windows_us_ny?id=0001' + advertiser_url: 'https://www.example.com/desktop_windows_us_ny' + - id: 56789 + name: 'Example ORG' + click_url: 'https://example.org/desktop_windows_us_ny?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_windows_us_ny02.jpg' + impression_url: 'https://example.org/desktop_windows_us_ny?id=0002' + advertiser_url: 'https://www.example.org/desktop_windows_us_ny' + + macos: + status_code: 200 + headers: [] + content: + tiles: + - id: 12346 + name: 'Example COM' + click_url: 'https://example.com/desktop_macos_us_ny?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_macos_us_ny01.jpg' + impression_url: 'https://example.com/desktop_macos_us_ny?id=0001' + advertiser_url: 'https://www.example.com/desktop_macos_us_ny' + - id: 56790 + name: 'Example ORG' + click_url: 'https://example.org/desktop_macos_us_ny?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_macos_us_ny02.jpg' + impression_url: 'https://example.org/desktop_macos_us_ny?id=0002' + advertiser_url: 'https://www.example.org/desktop_macos_us_ny' + + linux: + status_code: 200 + headers: [] + content: + tiles: + - id: 12347 + name: 'Example COM' + click_url: 'https://example.com/desktop_linux_us_ny?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_linux_us_ny01.jpg' + impression_url: 'https://example.com/desktop_linux_us_ny?id=0001' + advertiser_url: 'https://www.example.com/desktop_linux_us_ny' + - id: 56791 + name: 'Example ORG' + click_url: 'https://example.org/desktop_linux_us_ny?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_linux_us_ny02.jpg' + impression_url: 'https://example.org/desktop_linux_us_ny?id=0002' + advertiser_url: 'https://www.example.org/desktop_linux_us_ny' diff --git a/test-engineering/contract-tests/partner/app/tests/responses/US/responses.yml b/test-engineering/contract-tests/partner/app/tests/responses/US/responses.yml new file mode 100644 index 00000000..bbb23abb --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/responses/US/responses.yml @@ -0,0 +1,56 @@ +# This file contains all partner responses for the /tilesp API endpoint. +# We use form-factor and os-family to determine which response to send to Contile. +desktop: + windows: + status_code: 200 + headers: [] + content: + tiles: + - id: 12345 + name: 'Example COM' + click_url: 'https://example.com/desktop_windows_us?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_windows_us01.jpg' + impression_url: 'https://example.com/desktop_windows_us?id=0001' + advertiser_url: 'https://www.example.com/desktop_windows_us' + - id: 56789 + name: 'Example ORG' + click_url: 'https://example.org/desktop_windows_us?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_windows_us02.jpg' + impression_url: 'https://example.org/desktop_windows_us?id=0002' + advertiser_url: 'https://www.example.org/desktop_windows_us' + + macos: + status_code: 200 + headers: [] + content: + tiles: + - id: 12346 + name: 'Example COM' + click_url: 'https://example.com/desktop_macos_us?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_macos_us01.jpg' + impression_url: 'https://example.com/desktop_macos_us?id=0001' + advertiser_url: 'https://www.example.com/desktop_macos_us' + - id: 56790 + name: 'Example ORG' + click_url: 'https://example.org/desktop_macos_us?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_macos_us02.jpg' + impression_url: 'https://example.org/desktop_macos_us?id=0002' + advertiser_url: 'https://www.example.org/desktop_macos_us' + + linux: + status_code: 200 + headers: [] + content: + tiles: + - id: 12347 + name: 'Example COM' + click_url: 'https://example.com/desktop_linux_us?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_linux_us01.jpg' + impression_url: 'https://example.com/desktop_linux_us?id=0001' + advertiser_url: 'https://www.example.com/desktop_linux_us' + - id: 56791 + name: 'Example ORG' + click_url: 'https://example.org/desktop_linux_us?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_linux_us02.jpg' + impression_url: 'https://example.org/desktop_linux_us?id=0002' + advertiser_url: 'https://www.example.org/desktop_linux_us' diff --git a/test-engineering/contract-tests/partner/app/tests/responses/responses.yml b/test-engineering/contract-tests/partner/app/tests/responses/responses.yml new file mode 100644 index 00000000..6ef043c4 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/responses/responses.yml @@ -0,0 +1,87 @@ +# This file contains all partner responses for the /tilesp API endpoint. +# We use form-factor and os-family to determine which response to send to Contile. +desktop: + windows: + status_code: 200 + headers: [] + content: + tiles: + - id: 12345 + name: 'Example COM' + click_url: 'https://example.com/desktop_windows?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_windows01.jpg' + impression_url: 'https://example.com/desktop_windows?id=0001' + advertiser_url: 'https://www.example.com/desktop_windows' + - id: 56789 + name: 'Example ORG' + click_url: 'https://example.org/desktop_windows?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_windows02.jpg' + impression_url: 'https://example.org/desktop_windows?id=0002' + advertiser_url: 'https://www.example.org/desktop_windows' + + macos: + status_code: 200 + headers: [] + content: + tiles: + - id: 12346 + name: 'Example COM' + click_url: 'https://example.com/desktop_macos?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_macos01.jpg' + impression_url: 'https://example.com/desktop_macos?id=0001' + advertiser_url: 'https://www.example.com/desktop_macos' + - id: 56790 + name: 'Example ORG' + click_url: 'https://example.org/desktop_macos?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_macos02.jpg' + impression_url: 'https://example.org/desktop_macos?id=0002' + advertiser_url: 'https://www.example.org/desktop_macos' + + linux: + status_code: 200 + headers: [] + content: + tiles: + - id: 12347 + name: 'Example COM' + click_url: 'https://example.com/desktop_linux?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_linux01.jpg' + impression_url: 'https://example.com/desktop_linux?id=0001' + advertiser_url: 'https://www.example.com/desktop_linux' + - id: 56791 + name: 'Example ORG' + click_url: 'https://example.org/desktop_linux?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_linux02.jpg' + impression_url: 'https://example.org/desktop_linux?id=0002' + advertiser_url: 'https://www.example.org/desktop_linux' + +phone: + android: + status_code: 500 + headers: [] + content: {} + + ios: + delay: 5.0 + status_code: 200 + headers: [] + content: + tiles: + - id: 12348 + name: 'Example COM' + click_url: 'https://example.com/desktop_ios?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000' + image_url: 'https://example.com/desktop_ios01.jpg' + impression_url: 'https://example.com/desktop_ios?id=0001' + advertiser_url: 'https://www.example.com/desktop_ios' + - id: 56792 + name: 'Example ORG' + click_url: 'https://example.org/desktop_ios?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A' + image_url: 'https://example.org/desktop_ios02.jpg' + impression_url: 'https://example.org/desktop_ios?id=0002' + advertiser_url: 'https://www.example.org/desktop_ios' + +tablet: + ios: + status_code: 200 + headers: [] + content: "hello world" diff --git a/test-engineering/contract-tests/partner/app/tests/test_app.py b/test-engineering/contract-tests/partner/app/tests/test_app.py new file mode 100644 index 00000000..17eb3ddc --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/test_app.py @@ -0,0 +1,325 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import pytest + + +def test_read_root(client, version): + response = client.get("/") + message = ( + f"Hello world! From FastAPI running on Uvicorn " + f"with Gunicorn. Using Python {version}" + ) + + assert response.status_code == 200 + assert response.json() == {"message": message} + + +def test_read_tilesp(client): + """Test that /tilesp API endpoint returns the expected response for the + example values for the required query parameters from the API specification. + """ + response = client.get( + "/tilesp/desktop", + params={ + "partner": "demofeed", + "sub1": "123456789", + "sub2": "placement1", + "country-code": "US", + "region-code": "NY", + "dma-code": "532", + "form-factor": "desktop", + "os-family": "macos", + "v": "1.0", + "results": "2", + }, + ) + + assert response.status_code == 200 + assert response.json() == { + "tiles": [ + { + "id": 12346, + "name": "Example COM", + "click_url": "https://example.com/desktop_macos_us_ny?version=16.0.0&key=22.1&ci=6.2&ctag=1612376952400200000", + "image_url": "https://example.com/desktop_macos_us_ny01.jpg", + "impression_url": "https://example.com/desktop_macos_us_ny?id=0001", + "advertiser_url": "https://www.example.com/desktop_macos_us_ny", + }, + { + "id": 56790, + "name": "Example ORG", + "click_url": "https://example.org/desktop_macos_us_ny?version=16.0.0&key=7.2&ci=8.9&ctag=E1DE38C8972D0281F5556659A", + "image_url": "https://example.org/desktop_macos_us_ny02.jpg", + "impression_url": "https://example.org/desktop_macos_us_ny?id=0002", + "advertiser_url": "https://www.example.org/desktop_macos_us_ny", + }, + ] + } + + +@pytest.mark.parametrize( + "sub2", + [ + "invalid-param", + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", + "🛒📈🤖", + ], + ids=["hyphen_in_value", "exceeds_max_characters", "emoji"], +) +def test_read_tilesp_validate_sub2(client, sub2): + """Test that only alphanumeric characters and maximum 128 characters are + accepted as values for the sub2 query parameter. + + See https://github.com/mozilla-services/contile-integration-tests/issues/38 + """ + response = client.get( + "/tilesp/desktop", + params={ + "partner": "demofeed", + "sub1": "123456789", + "sub2": sub2, + "country-code": "US", + "region-code": "NY", + "form-factor": "desktop", + "os-family": "macos", + "v": "1.0", + "results": "2", + }, + ) + + assert response.status_code == 400 + + response_content = response.json() + assert "tiles" not in response_content + assert "status" in response_content + assert "count" in response_content + assert "response" in response_content + + +@pytest.mark.parametrize( + "country_code", + [ + "invalid-param", + "us", + "11", + "1U", + "USAC", + "🛒📈🤖", + ], + ids=[ + "hyphen_in_value", + "all_lowercase", + "numeric", + "alpha_numeric", + "exceeds_max_characters", + "emoji", + ], +) +def test_read_tilesp_validate_country_code(client, country_code): + """Test that only two uppercase characters are accepted as values for the + country-code query parameter. + + See https://github.com/mozilla-services/contile-integration-tests/issues/39 + """ + response = client.get( + "/tilesp/desktop", + params={ + "partner": "demofeed", + "sub1": "123456789", + "sub2": "sub2", + "country-code": country_code, + "region-code": "NY", + "form-factor": "desktop", + "os-family": "macos", + "v": "1.0", + "results": "2", + }, + ) + + assert response.status_code == 400 + + response_content = response.json() + assert "tiles" not in response_content + assert "status" in response_content + assert "count" in response_content + assert "response" in response_content + + +@pytest.mark.parametrize( + "country_code, region_code, dma_code", + [ + ("CA", "BC", ""), + ("DE", "BE", ""), + ("GB", "SCT", ""), + ("FR", "BRE", ""), + ("AU", "WA", ""), + ("IT", "52", ""), + ("MX", "CHH", ""), + ("IN", "PB", ""), + ("BR", "RJ", ""), + ("ES", "M", ""), + ("US", "", ""), + ("US", "NY", "532"), + ], +) +def test_read_tilesp_accepted_country_region_code( + client, country_code, region_code, dma_code +): + """Test that the API endpoint accepts region codes from countries Contile + has been rolled out to for the region-code query parameter. + + See https://github.com/mozilla-services/contile-integration-tests/issues/39 + See https://github.com/mozilla-services/contile-integration-tests/issues/40 + """ + response = client.get( + "/tilesp/desktop", + params={ + "partner": "demofeed", + "sub1": "123456789", + "sub2": "sub2", + "country-code": country_code, + "region-code": region_code, + "dma-code": dma_code, + "form-factor": "desktop", + "os-family": "macos", + "v": "1.0", + "results": "2", + }, + ) + + assert response.status_code == 200 + assert "tiles" in response.json() + + +@pytest.mark.parametrize( + "region_code", + [ + "US-AZ", + "12AS", + "ny", + "🛒📈🤖", + ], + ids=[ + "hyphen_in_value", + "exceeds_max_characters", + "all_lower_cases", + "emoji", + ], +) +def test_read_tilesp_validate_region_code(client, region_code): + """Test only alphanumeric characters and maximum 3 characters are accepted + as values for the region_code query parameter. + + See https://github.com/mozilla-services/contile-integration-tests/issues/40 + """ + response = client.get( + "/tilesp/desktop", + params={ + "partner": "demofeed", + "sub1": "123456789", + "sub2": "sub2", + "country-code": "US", + "region-code": region_code, + "form-factor": "desktop", + "os-family": "macos", + "v": "1.0", + "results": "2", + }, + ) + + assert response.status_code == 400 + + response_content = response.json() + assert "tiles" not in response_content + assert "status" in response_content + assert "count" in response_content + assert "response" in response_content + + +@pytest.mark.parametrize( + "dma_code", + [ + "US-AZ", + "ny1", + "🛒📈🤖", + ], + ids=[ + "hyphen_in_value", + "alpha_numeric", + "emoji", + ], +) +def test_read_tilesp_validate_dma_code(client, dma_code): + """Test that if provided the DMA code is submitted as an unsigned integer. + + See https://github.com/mozilla-services/contile-integration-tests/issues/62 + """ + response = client.get( + "/tilesp/desktop", + params={ + "partner": "demofeed", + "sub1": "123456789", + "sub2": "sub2", + "country-code": "US", + "region-code": "NY", + "dma-code": dma_code, + "form-factor": "desktop", + "os-family": "macos", + "v": "1.0", + "results": "2", + }, + ) + + assert response.status_code == 400 + + response_content = response.json() + assert "tiles" not in response_content + assert "status" in response_content + assert "count" in response_content + assert "response" in response_content + + fastapi_error = { + "body": None, + "detail": [ + { + "ctx": {"pattern": "^([0-9]+)?$"}, + "loc": ["query", "dma-code"], + "msg": 'string does not match regex "^([0-9]+)?$"', + "type": "value_error.str.regex", + } + ], + } + assert response_content["test"] == fastapi_error + + +def test_read_tilesp_error_for_unknown_query_params(client): + """Test that the API endpoint returns an error for any parameter other than + the accepted query parameters. + + See https://github.com/mozilla-services/contile-integration-tests/issues/41 + """ + response = client.get( + "/tilesp/desktop", + params={ + "partner": "demofeed", + "sub1": "123456789", + "sub2": "sub2", + "country-code": "US", + "region-code": "NY", + "form-factor": "desktop", + "os-family": "macos", + "v": "1.0", + "results": "2", + "unknown-query-param": "unknown-query-param", + }, + ) + + assert response.status_code == 400 + + response_content = response.json() + assert "tiles" not in response_content + assert "status" in response_content + assert "count" in response_content + assert "response" in response_content diff --git a/test-engineering/contract-tests/partner/app/tests/test_responses.py b/test-engineering/contract-tests/partner/app/tests/test_responses.py new file mode 100644 index 00000000..72e98595 --- /dev/null +++ b/test-engineering/contract-tests/partner/app/tests/test_responses.py @@ -0,0 +1,147 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +import logging +import os +from pathlib import Path + +import pytest +from responses import LoaderConfig, load_responses + + +@pytest.fixture(name="responses_dir", autouse=True) +def fixture_cache_clear() -> None: + """Clear the LRU cache before every test.""" + load_responses.cache_clear() + + +@pytest.fixture(name="loader_config") +def fixture_loader_config() -> LoaderConfig: + """Return a Path to the directory containing responses files.""" + return LoaderConfig(responses_dir=Path(os.environ["RESPONSES_DIR"])) + + +def test_fallback_to_default_for_country(caplog, loader_config: LoaderConfig): + """Test that load_responses() falls back to loading a country's default + responses if region_code is an empty string. + """ + with caplog.at_level(logging.DEBUG, logger="partner"): + responses = load_responses( + config=loader_config, country_code="US", region_code="" + ) + + assert caplog.record_tuples == [ + ( + "partner", + logging.DEBUG, + f"load responses using config {loader_config}", + ), + ( + "partner", + logging.DEBUG, + "load responses for country_code 'US' and region_code ''", + ), + ( + "partner", + logging.DEBUG, + "load responses from US/responses.yml", + ), + ] + + assert responses + + +def test_fallback_to_global_default(caplog, loader_config: LoaderConfig): + """Test that load_responses() falls back to loading the global default + responses if it cannot find a responses.yml for the given country_code and + region_code. + """ + with caplog.at_level(logging.DEBUG, logger="partner"): + responses = load_responses( + config=loader_config, country_code="GB", region_code="" + ) + + assert caplog.record_tuples == [ + ( + "partner", + logging.DEBUG, + f"load responses using config {loader_config}", + ), + ( + "partner", + logging.DEBUG, + "load responses for country_code 'GB' and region_code ''", + ), + ( + "partner", + logging.DEBUG, + "load responses from responses.yml", + ), + ] + + assert responses + + +def test_lru_cache(caplog, loader_config: LoaderConfig): + """Test that the load_responses method is cached and responses.yml files are + only loaded once for a given country_code and region_code combination. + """ + + with caplog.at_level(logging.DEBUG, logger="partner"): + load_responses(config=loader_config, country_code="US", region_code="NY") + load_responses(config=loader_config, country_code="DE", region_code="BE") + + # The next call to load_responses is expected to be cached + load_responses(config=loader_config, country_code="US", region_code="NY") + + load_responses(config=loader_config, country_code="GB", region_code="SCT") + + assert caplog.record_tuples == [ + ( + "partner", + logging.DEBUG, + f"load responses using config {loader_config}", + ), + ( + "partner", + logging.DEBUG, + "load responses for country_code 'US' and region_code 'NY'", + ), + ( + "partner", + logging.DEBUG, + "load responses from US/NY.yml", + ), + ( + "partner", + logging.DEBUG, + f"load responses using config {loader_config}", + ), + ( + "partner", + logging.DEBUG, + "load responses for country_code 'DE' and region_code 'BE'", + ), + ( + "partner", + logging.DEBUG, + "load responses from DE/responses.yml", + ), + ( + "partner", + logging.DEBUG, + f"load responses using config {loader_config}", + ), + ( + "partner", + logging.DEBUG, + "load responses for country_code 'GB' and region_code 'SCT'", + ), + ( + "partner", + logging.DEBUG, + "load responses from responses.yml", + ), + ] diff --git a/test-engineering/contract-tests/partner/config/gunicorn_conf.py b/test-engineering/contract-tests/partner/config/gunicorn_conf.py new file mode 100644 index 00000000..63f4d9cf --- /dev/null +++ b/test-engineering/contract-tests/partner/config/gunicorn_conf.py @@ -0,0 +1,18 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +import pathlib + +import yaml + +port = os.getenv("PORT", "8000") +root = os.getenv("ROOT", "") + +accesslog = "-" +errorlog = "-" +workers = 4 + +with pathlib.Path(root + "config/logging.yml").open() as f: + logconfig_dict = yaml.safe_load(f) diff --git a/test-engineering/contract-tests/partner/config/logging.yml b/test-engineering/contract-tests/partner/config/logging.yml new file mode 100644 index 00000000..201ee854 --- /dev/null +++ b/test-engineering/contract-tests/partner/config/logging.yml @@ -0,0 +1,38 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +version: 1 +formatters: + simple: + format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s' +handlers: + console: + class: logging.StreamHandler + level: DEBUG + formatter: simple + stream: ext://sys.stdout +loggers: + gunicorn.error: + level: INFO + handlers: [console] + propagate: no + gunicorn.access: + level: INFO + handlers: [console] + propagate: no + uvicorn.error: + level: INFO + handlers: [console] + propagate: no + uvicorn.access: + level: INFO + handlers: [console] + propagate: no + partner: + level: DEBUG + handlers: [console] + propagate: no +root: + level: DEBUG + handlers: [console] diff --git a/test-engineering/contract-tests/partner/dev-requirements.in b/test-engineering/contract-tests/partner/dev-requirements.in new file mode 100644 index 00000000..c2a6ba3e --- /dev/null +++ b/test-engineering/contract-tests/partner/dev-requirements.in @@ -0,0 +1,8 @@ +-c requirements.txt +black +flake8 +isort +mypy +pytest +requests +types-PyYAML diff --git a/test-engineering/contract-tests/partner/dev-requirements.txt b/test-engineering/contract-tests/partner/dev-requirements.txt new file mode 100644 index 00000000..4563cc88 --- /dev/null +++ b/test-engineering/contract-tests/partner/dev-requirements.txt @@ -0,0 +1,68 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile dev-requirements.in +# +attrs==21.2.0 + # via pytest +black==22.3.0 + # via -r dev-requirements.in +certifi==2021.5.30 + # via requests +charset-normalizer==2.0.3 + # via requests +click==8.0.1 + # via + # -c requirements.txt + # black +flake8==4.0.1 + # via -r dev-requirements.in +idna==2.10 + # via requests +iniconfig==1.1.1 + # via pytest +isort==5.10.1 + # via -r dev-requirements.in +mccabe==0.6.1 + # via flake8 +mypy==0.910 + # via -r dev-requirements.in +mypy-extensions==0.4.3 + # via + # black + # mypy +packaging==20.9 + # via pytest +pathspec==0.9.0 + # via black +platformdirs==2.2.0 + # via black +pluggy==0.13.1 + # via pytest +py==1.10.0 + # via pytest +pycodestyle==2.8.0 + # via flake8 +pyflakes==2.4.0 + # via flake8 +pyparsing==2.4.7 + # via packaging +pytest==7.1.1 + # via -r dev-requirements.in +requests==2.27.1 + # via -r dev-requirements.in +toml==0.10.2 + # via mypy +tomli==1.1.0 + # via + # black + # pytest +types-pyyaml==6.0.5 + # via -r dev-requirements.in +typing-extensions==3.10.0.0 + # via + # -c requirements.txt + # mypy +urllib3==1.26.5 + # via requests diff --git a/test-engineering/contract-tests/partner/entrypoint.sh b/test-engineering/contract-tests/partner/entrypoint.sh new file mode 100644 index 00000000..cc5c4c9b --- /dev/null +++ b/test-engineering/contract-tests/partner/entrypoint.sh @@ -0,0 +1,5 @@ +#!/bin/sh +set -e + +. venv/bin/activate +exec "$@" diff --git a/test-engineering/contract-tests/partner/mypy.ini b/test-engineering/contract-tests/partner/mypy.ini new file mode 100644 index 00000000..e4827b42 --- /dev/null +++ b/test-engineering/contract-tests/partner/mypy.ini @@ -0,0 +1,11 @@ +[mypy] +python_version=3.8 +follow_imports=normal +ignore_missing_imports=True +disallow_untyped_calls=True +warn_return_any=True +strict_optional=True +warn_no_return=True +warn_redundant_casts=True +warn_unused_ignores=True +plugins = pydantic.mypy diff --git a/test-engineering/contract-tests/partner/requirements.in b/test-engineering/contract-tests/partner/requirements.in new file mode 100644 index 00000000..dcb87d00 --- /dev/null +++ b/test-engineering/contract-tests/partner/requirements.in @@ -0,0 +1,4 @@ +fastapi +gunicorn +pyyaml +uvicorn[standard] diff --git a/test-engineering/contract-tests/partner/requirements.txt b/test-engineering/contract-tests/partner/requirements.txt new file mode 100644 index 00000000..df9c9024 --- /dev/null +++ b/test-engineering/contract-tests/partner/requirements.txt @@ -0,0 +1,41 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile requirements.in +# +asgiref==3.4.1 + # via uvicorn +click==8.0.1 + # via uvicorn +fastapi==0.68.2 + # via -r requirements.in +gunicorn==20.1.0 + # via -r requirements.in +h11==0.12.0 + # via uvicorn +httptools==0.4.0 + # via uvicorn +pydantic==1.8.2 + # via fastapi +python-dotenv==0.17.1 + # via uvicorn +pyyaml==6.0 + # via + # -r requirements.in + # uvicorn +starlette==0.14.2 + # via fastapi +typing-extensions==3.10.0.0 + # via pydantic +uvicorn[standard]==0.17.6 + # via -r requirements.in +uvloop==0.15.2 + # via uvicorn +watchgod==0.7 + # via uvicorn +websockets==10.1 + # via uvicorn + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/test-engineering/contract-tests/partner/tox.ini b/test-engineering/contract-tests/partner/tox.ini new file mode 100644 index 00000000..16e86a5c --- /dev/null +++ b/test-engineering/contract-tests/partner/tox.ini @@ -0,0 +1,56 @@ +[tox] +envlist = black, flake8, mypy, py38 +isolated_build = False + +[testenv] +# Use Python 3.8 for all test environments +basepython = python3.8 +setenv = + RESPONSES_DIR = {toxinidir}/app/tests/responses + ACCEPTED_MOBILE_FORM_FACTORS = phone,tablet + ACCEPTED_DESKTOP_FORM_FACTORS = desktop + PYTHONPATH = {toxinidir}/app + +# The app is not set up as a Python package +skip_install = True + +# We use pip-tools to install compatible packages +deps = pip-tools + +[testenv:py38] +commands_pre = + # Install the pinned app and development requirements + pip-sync {toxinidir}/requirements.txt {toxinidir}/dev-requirements.txt + # Verify installed packages have compatible dependencies + pip check -v +commands = + # Run the unit tests + pytest -v {posargs:app/tests} + +[testenv:black] +commands_pre = + # Install the pinned development requirements + pip-sync {toxinidir}/dev-requirements.txt +commands = + black --check app/ + +[testenv:flake8] +commands_pre = + # Install the pinned development requirements + pip-sync {toxinidir}/dev-requirements.txt +commands = + flake8 + +[flake8] +max-line-length = 88 +per-file-ignores = + app/tests/test_app.py:E501 + +[testenv:mypy] +commands_pre = + # Install the pinned app and development requirements + pip-sync {toxinidir}/requirements.txt {toxinidir}/dev-requirements.txt + # Verify installed packages have compatible dependencies + pip check -v +commands = + mypy app/ diff --git a/test-engineering/contract-tests/sequence_diagram.png b/test-engineering/contract-tests/sequence_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1ea9154d9a8a59c34f9f414b67a783b74740a7 GIT binary patch literal 312221 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ŤQV_!euLpBG(Q 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 lHGI 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�MNF!I`7=ErhrfrYFn`u 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 literal 0 HcmV?d00001 diff --git a/contract-tests/volumes/client/scenarios.yml b/test-engineering/contract-tests/volumes/client/scenarios.yml similarity index 100% rename from contract-tests/volumes/client/scenarios.yml rename to test-engineering/contract-tests/volumes/client/scenarios.yml diff --git a/contract-tests/volumes/client/scenarios_204.yml b/test-engineering/contract-tests/volumes/client/scenarios_204.yml similarity index 100% rename from contract-tests/volumes/client/scenarios_204.yml rename to test-engineering/contract-tests/volumes/client/scenarios_204.yml diff --git a/contract-tests/volumes/client/scenarios_init_error.yml b/test-engineering/contract-tests/volumes/client/scenarios_init_error.yml similarity index 100% rename from contract-tests/volumes/client/scenarios_init_error.yml rename to test-engineering/contract-tests/volumes/client/scenarios_init_error.yml diff --git a/contract-tests/volumes/contile/adm_settings.json b/test-engineering/contract-tests/volumes/contile/adm_settings.json similarity index 100% rename from contract-tests/volumes/contile/adm_settings.json rename to test-engineering/contract-tests/volumes/contile/adm_settings.json diff --git a/contract-tests/volumes/contile/adm_settings_init_error.json b/test-engineering/contract-tests/volumes/contile/adm_settings_init_error.json similarity index 100% rename from contract-tests/volumes/contile/adm_settings_init_error.json rename to test-engineering/contract-tests/volumes/contile/adm_settings_init_error.json diff --git a/contract-tests/volumes/partner/GB/responses.yml b/test-engineering/contract-tests/volumes/partner/GB/responses.yml similarity index 100% rename from contract-tests/volumes/partner/GB/responses.yml rename to test-engineering/contract-tests/volumes/partner/GB/responses.yml diff --git a/contract-tests/volumes/partner/US/WA.yml b/test-engineering/contract-tests/volumes/partner/US/WA.yml similarity index 100% rename from contract-tests/volumes/partner/US/WA.yml rename to test-engineering/contract-tests/volumes/partner/US/WA.yml diff --git a/contract-tests/volumes/partner/responses.yml b/test-engineering/contract-tests/volumes/partner/responses.yml similarity index 100% rename from contract-tests/volumes/partner/responses.yml rename to test-engineering/contract-tests/volumes/partner/responses.yml