diff --git a/.github/actions/test-backend/action.yml b/.github/actions/test-backend/action.yml index b7946d28c..8a8cf2d5e 100644 --- a/.github/actions/test-backend/action.yml +++ b/.github/actions/test-backend/action.yml @@ -7,7 +7,6 @@ inputs: runs: using: composite steps: - - uses: browser-actions/setup-chrome@latest - name: Set up Python 3.9 uses: actions/setup-python@v5 with: @@ -18,16 +17,6 @@ runs: python -m pip install --upgrade pip pip install -r requirements.txt shell: bash - - name: Install Elasticsearch - run: | - wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.6-amd64.deb -q - wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.6-amd64.deb.sha512 - shasum -a 512 -c elasticsearch-7.17.6-amd64.deb.sha512 - sudo dpkg -i elasticsearch-7.17.6-amd64.deb - shell: bash - - name: Start Elasticsearch - run: sudo systemctl start elasticsearch.service - shell: bash - name: Write Google Drive API credentials to file uses: jsdaniell/create-json@v1.2.3 with: diff --git a/.github/workflows/auto-author-assign.yml b/.github/workflows/auto-author-assign.yml index 4087d5340..77292c05f 100644 --- a/.github/workflows/auto-author-assign.yml +++ b/.github/workflows/auto-author-assign.yml @@ -9,4 +9,4 @@ jobs: assign-author: runs-on: ubuntu-latest steps: - - uses: toshimaru/auto-author-assign@v2.2.1 + - uses: toshimaru/auto-author-assign@v2.1.1 diff --git a/MPCAutofill/MPCAutofill/settings.py b/MPCAutofill/MPCAutofill/settings.py index f2c06645d..1967594e5 100755 --- a/MPCAutofill/MPCAutofill/settings.py +++ b/MPCAutofill/MPCAutofill/settings.py @@ -182,8 +182,9 @@ # elasticsearch DSL settings ELASTICSEARCH_HOST = env("ELASTICSEARCH_HOST", default="localhost") +ELASTICSEARCH_PORT = env("ELASTICSEARCH_PORT", default="9200") ELASTICSEARCH_DSL = { - "default": {"hosts": f"{ELASTICSEARCH_HOST}:9200"}, + "default": {"hosts": f"{ELASTICSEARCH_HOST}:{ELASTICSEARCH_PORT}"}, } ELASTICSEARCH_DSL_AUTOSYNC = False diff --git a/MPCAutofill/cardpicker/search/search_functions.py b/MPCAutofill/cardpicker/search/search_functions.py index 85ed513f5..e1be0e74c 100644 --- a/MPCAutofill/cardpicker/search/search_functions.py +++ b/MPCAutofill/cardpicker/search/search_functions.py @@ -54,7 +54,7 @@ def __init__(self) -> None: def get_elasticsearch_connection() -> Elasticsearch: if (es := getattr(thread_local, "elasticsearch", None)) is None: - es = Elasticsearch([settings.ELASTICSEARCH_HOST], port=9200) + es = Elasticsearch([settings.ELASTICSEARCH_HOST], port=settings.ELASTICSEARCH_PORT) return es diff --git a/MPCAutofill/cardpicker/tests/__snapshots__/test_sources.ambr b/MPCAutofill/cardpicker/tests/__snapshots__/test_sources.ambr index b2864c247..6aceb7868 100644 --- a/MPCAutofill/cardpicker/tests/__snapshots__/test_sources.ambr +++ b/MPCAutofill/cardpicker/tests/__snapshots__/test_sources.ambr @@ -1,20 +1,20 @@ # name: TestUpdateDatabase.test_comprehensive_snapshot[cards] list([ + Mountain [Type: CARD, Identifier: 1-dcs0FEE05MTGiYbKqs9HnRdhXkgtIJG, Uploaded: 22/09/2022, Priority: 7]>, Plains [Type: CARD, Identifier: 1743iShpNEhY5xQ2PCUNpca4UL5t4rG3g, Uploaded: 22/09/2022, Priority: 7]>, Delver of Secrets [Type: CARD, Identifier: 17fopRCNRge72U8Hac8pApHZtEalx5kHy, Uploaded: 09/10/2022, Priority: 2]>, Huntmaster of the Fells [Type: CARD, Identifier: 1991MWCur9NdAFi-tQQD5YbQj2oqV_WRy, Uploaded: 22/09/2022, Priority: 2]>, - Brainstorm [Type: CARD, Identifier: 1c4M-sK9gd0Xju0NXCPtqeTW_DQTldVU5, Uploaded: 22/09/2022, Priority: 2]>, - Mountain [Type: CARD, Identifier: 1-dcs0FEE05MTGiYbKqs9HnRdhXkgtIJG, Uploaded: 22/09/2022, Priority: 7]>, - Past in Flames [Type: CARD, Identifier: 1dxSLHtw-VwwE09pZCA8OA6LbuWRZPEoU, Uploaded: 24/09/2022, Priority: 2]>, Island (William Bradford) [Type: CARD, Identifier: 1HsvTYs1jFGe1c8U1PnNZ9aB8jkAW7KU0, Uploaded: 22/09/2022, Priority: 6]>, Island [Type: CARD, Identifier: 1IDtqSjJ4Yo45AnNA4SplOiN7ewibifMa, Uploaded: 22/09/2022, Priority: 7]>, Simple Cube [Type: CARDBACK, Identifier: 1JtXL6Ca9nQkvhwZZRR9ZuKA9_DzsFf1V, Uploaded: 22/09/2022, Priority: 17]>, - Ravager of the Fells [Type: CARD, Identifier: 1lv8WC1Xf1qxA7VHSc8jOtT5up6FwaBPH, Uploaded: 22/09/2022, Priority: 2]>, - Insectile Aberration [Type: CARD, Identifier: 1mO73GTYlieP0kiZEkF58pJSrZTmC9lNh, Uploaded: 09/10/2022, Priority: 2]>, Swamp [Type: CARD, Identifier: 1O5Y_lBOBJK1D9Tw6pcsQJXYoTZXhR3mV, Uploaded: 22/09/2022, Priority: 7]>, - Simple Lotus [Type: CARDBACK, Identifier: 1oigI6wz0zA--pNMuExKTs40kBNH6VRP_, Uploaded: 22/09/2022, Priority: 7]>, Forest [Type: CARD, Identifier: 1Sne_vn7TlohIbsjt933Kd5k2ff6vFS1I, Uploaded: 22/09/2022, Priority: 7]>, Pást in Flames [Type: CARD, Identifier: 1UPdh7J7hScg4ZnxSPJ-EeBYHLp2s3Oz1, Uploaded: 24/09/2022, Priority: 2]>, Goblin [Type: TOKEN, Identifier: 1V5E0avDmNyEUuFfYwx3nA05aj-1HY0rA, Uploaded: 09/10/2022, Priority: 2]>, + Brainstorm [Type: CARD, Identifier: 1c4M-sK9gd0Xju0NXCPtqeTW_DQTldVU5, Uploaded: 22/09/2022, Priority: 2]>, + Past in Flames [Type: CARD, Identifier: 1dxSLHtw-VwwE09pZCA8OA6LbuWRZPEoU, Uploaded: 24/09/2022, Priority: 2]>, + Ravager of the Fells [Type: CARD, Identifier: 1lv8WC1Xf1qxA7VHSc8jOtT5up6FwaBPH, Uploaded: 22/09/2022, Priority: 2]>, + Insectile Aberration [Type: CARD, Identifier: 1mO73GTYlieP0kiZEkF58pJSrZTmC9lNh, Uploaded: 09/10/2022, Priority: 2]>, + Simple Lotus [Type: CARDBACK, Identifier: 1oigI6wz0zA--pNMuExKTs40kBNH6VRP_, Uploaded: 22/09/2022, Priority: 7]>, ]) # --- diff --git a/MPCAutofill/cardpicker/tests/conftest.py b/MPCAutofill/cardpicker/tests/conftest.py index af45751dd..8ec15beda 100644 --- a/MPCAutofill/cardpicker/tests/conftest.py +++ b/MPCAutofill/cardpicker/tests/conftest.py @@ -3,7 +3,10 @@ import pytest from pytest_elasticsearch import factories +from testcontainers.elasticsearch import ElasticSearchContainer +from testcontainers.postgres import PostgresContainer +from django.conf import settings as conf_settings from django.core.management import call_command from cardpicker.integrations.base import GameIntegration @@ -16,6 +19,37 @@ TagFactory, ) +POSTGRES_PORT = 47000 +ELASTICSEARCH_PORT = 9300 # this is the default expected by `elasticsearch_nooproc` + + +@pytest.fixture(scope="session") +def postgres_container(): + postgres = PostgresContainer("postgres:16.0-alpine").with_bind_ports(5432, POSTGRES_PORT) + postgres.start() + yield postgres + postgres.stop() + + +@pytest.fixture(scope="session") +def elasticsearch_container(): + elasticsearch = ElasticSearchContainer("elasticsearch:7.17.23", mem_limit="1G").with_bind_ports( + 9200, ELASTICSEARCH_PORT + ) + elasticsearch.start() + yield elasticsearch + elasticsearch.stop() + + +@pytest.fixture(scope="session") +def django_db_modify_db_settings(postgres_container): + # customise settings to point to testcontainers db + conf_settings.DATABASES["default"]["HOST"] = postgres_container.get_container_host_ip() + conf_settings.DATABASES["default"]["PORT"] = POSTGRES_PORT + conf_settings.DATABASES["default"]["NAME"] = postgres_container.dbname + conf_settings.DATABASES["default"]["USER"] = postgres_container.username + conf_settings.DATABASES["default"]["PASSWORD"] = postgres_container.password + @pytest.fixture() def django_settings(db, settings): @@ -42,11 +76,11 @@ def dummy_integration(integration_setter) -> Type[GameIntegration]: @pytest.fixture(scope="session", autouse=True) -def elasticsearch(): - """ - This fixture expects elasticsearch to be running on your machine. - """ - +def elasticsearch(elasticsearch_container): + conf_settings.ELASTICSEARCH_DSL["default"][ + "hosts" + ] = f"{elasticsearch_container.get_container_host_ip()}:{ELASTICSEARCH_PORT}" + conf_settings.ELASTICSEARCH_PORT = ELASTICSEARCH_PORT return factories.elasticsearch("elasticsearch_nooproc") diff --git a/MPCAutofill/requirements.txt b/MPCAutofill/requirements.txt index eb23cd608..10dc93737 100644 --- a/MPCAutofill/requirements.txt +++ b/MPCAutofill/requirements.txt @@ -28,5 +28,6 @@ ratelimit~=2.2.1 requests~=2.31.0 sentry-sdk~=1.30.0 syrupy~=3.0 +testcontainers[postgres,elasticsearch] tqdm~=4.65.0 tzdata