Skip to content

Commit

Permalink
Speedup running tests locally and on CI (#3694)
Browse files Browse the repository at this point in the history
  • Loading branch information
marcoacierno authored Jan 27, 2024
1 parent f861eff commit b2b63f1
Show file tree
Hide file tree
Showing 9 changed files with 197 additions and 159 deletions.
12 changes: 8 additions & 4 deletions .github/workflows/backend-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ on:
jobs:
check-migrations:
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend

steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
Expand All @@ -18,17 +22,17 @@ jobs:
- run: pip install pdm==2.10.4

- name: Cache PDM
uses: actions/cache@v1
uses: actions/cache@v4
id: cache-deps
with:
path: ./.venv
path: backend/.venv
key: pdm-${{ hashFiles('**/pdm.lock') }}-2

- name: Install python dependencies
working-directory: backend
if: steps.cache-deps.outputs.cache-hit != 'true'
run: pdm install

- name: Check missing not pushed migrations
working-directory: backend
run: pdm run python manage.py makemigrations --check
env:
DJANGO_SETTINGS_MODULE: pycon.settings.test
Expand Down
15 changes: 9 additions & 6 deletions .github/workflows/backend-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ on:
jobs:
unit-tests:
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend

services:
postgres:
Expand All @@ -37,24 +40,24 @@ jobs:
- run: pip install pdm==2.10.4

- name: Cache PDM
uses: actions/cache@v1
uses: actions/cache@v4
id: cache-deps
with:
path: ./.venv
path: backend/.venv
key: pdm-${{ hashFiles('**/pdm.lock') }}-1

- name: Install python dependencies
working-directory: backend
if: steps.cache-deps.outputs.cache-hit != 'true'
run: pdm install

- name: Install codecov
working-directory: backend
run: pip install codecov

- name: pytest
working-directory: backend
run: |
set +e
OUTPUT=$(pdm run pytest --cov-report xml --cov=. --cov-fail-under 80)
CPUS=$(nproc --all)
OUTPUT=$(pdm run pytest --cov-report xml --cov=. --cov-fail-under 80 --durations 10 -n $CPUS)
STATUS=$?
echo "$OUTPUT"
cd ..
Expand Down
7 changes: 3 additions & 4 deletions backend/api/pretix/tests/test_get_conference_tickets.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
from api.pretix.types import Option


pytestmark = pytest.mark.django_db


@override_settings(PRETIX_API="https://pretix/api/")
@pytest.mark.django_db
def test_get_conference_tickets_no_tickets(conference, requests_mock):
requests_mock.get(
"https://pretix/api/organizers/base-pretix-organizer-id/events/base-pretix-event-id/items",
Expand All @@ -32,7 +34,6 @@ def test_get_conference_tickets_no_tickets(conference, requests_mock):


@override_settings(PRETIX_API="https://pretix/api/")
@pytest.mark.django_db
def test_get_conference_tickets(
conference,
requests_mock,
Expand Down Expand Up @@ -96,7 +97,6 @@ def test_get_conference_tickets(


@override_settings(PRETIX_API="https://pretix/api/")
@pytest.mark.django_db
def test_get_conference_tickets_hides_when_available_from_is_future(
conference,
requests_mock,
Expand Down Expand Up @@ -132,7 +132,6 @@ def test_get_conference_tickets_hides_when_available_from_is_future(


@override_settings(PRETIX_API="https://pretix/api/")
@pytest.mark.django_db
def test_get_conference_tickets_hides_when_available_until_is_past(
conference,
requests_mock,
Expand Down
5 changes: 3 additions & 2 deletions backend/api/submissions/tests/test_send_submission.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from conferences.tests.factories import ConferenceFactory, TopicFactory
import pytest
from pytest import mark

Expand Down Expand Up @@ -604,15 +605,15 @@ def test_submit_talk_with_not_valid_conf_topic(
):
graphql_client.force_login(user)

conference = conference_factory(
conference = ConferenceFactory(
topics=("my-topic",),
languages=("it",),
submission_types=("talk",),
active_cfp=True,
durations=("50",),
audience_levels=("Beginner",),
)
topic = topic_factory(name="random topic")
topic = TopicFactory(name="random topic")

resp, _ = _submit_talk(graphql_client, conference, topic=topic.id)

Expand Down
70 changes: 30 additions & 40 deletions backend/api/submissions/tests/test_submission_permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,12 @@ def test_voting_open_and_user_can_vote(
assert data["submission"]["type"]["name"] == submission.type.name
assert data["submission"]["duration"]["name"] == submission.duration.name
assert data["submission"]["audienceLevel"]["name"] == submission.audience_level.name
assert data["submission"]["languages"] == [
{"code": "it"},
{"code": "en"},
]
assert data["submission"]["tags"] == [
{"name": "python"},
{"name": "GraphQL"},
]
assert len(data["submission"]["languages"]) == 2
assert {"code": "it"} in data["submission"]["languages"]
assert {"code": "en"} in data["submission"]["languages"]
assert len(data["submission"]["tags"]) == 2
assert {"name": "python"} in data["submission"]["tags"]
assert {"name": "GraphQL"} in data["submission"]["tags"]

# ❌ private
assert data["submission"]["speakerLevel"] is None
Expand Down Expand Up @@ -157,14 +155,12 @@ def test_accepted_submission_user_can_see_public_and_restricted_fields(
assert data["submission"]["type"]["name"] == submission.type.name
assert data["submission"]["duration"]["name"] == submission.duration.name
assert data["submission"]["audienceLevel"]["name"] == submission.audience_level.name
assert data["submission"]["languages"] == [
{"code": "it"},
{"code": "en"},
]
assert data["submission"]["tags"] == [
{"name": "python"},
{"name": "GraphQL"},
]
assert len(data["submission"]["languages"]) == 2
assert {"code": "it"} in data["submission"]["languages"]
assert {"code": "en"} in data["submission"]["languages"]
assert len(data["submission"]["tags"]) == 2
assert {"name": "python"} in data["submission"]["tags"]
assert {"name": "GraphQL"} in data["submission"]["tags"]

# ❌ private
assert data["submission"]["speakerLevel"] is None
Expand All @@ -191,14 +187,12 @@ def test_admin_user_can_see_everything(
assert data["submission"]["type"]["name"] == submission.type.name
assert data["submission"]["duration"]["name"] == submission.duration.name
assert data["submission"]["audienceLevel"]["name"] == submission.audience_level.name
assert data["submission"]["languages"] == [
{"code": "it"},
{"code": "en"},
]
assert data["submission"]["tags"] == [
{"name": "python"},
{"name": "GraphQL"},
]
assert len(data["submission"]["languages"]) == 2
assert {"code": "it"} in data["submission"]["languages"]
assert {"code": "en"} in data["submission"]["languages"]
assert len(data["submission"]["tags"]) == 2
assert {"name": "python"} in data["submission"]["tags"]
assert {"name": "GraphQL"} in data["submission"]["tags"]

# ✔️ private
assert data["submission"]["speakerLevel"] == submission.speaker_level
Expand All @@ -223,14 +217,12 @@ def test_submission_author_can_see_everything(graphql_client, submission_factory
assert data["submission"]["type"]["name"] == submission.type.name
assert data["submission"]["duration"]["name"] == submission.duration.name
assert data["submission"]["audienceLevel"]["name"] == submission.audience_level.name
assert data["submission"]["languages"] == [
{"code": "it"},
{"code": "en"},
]
assert data["submission"]["tags"] == [
{"name": "python"},
{"name": "GraphQL"},
]
assert len(data["submission"]["languages"]) == 2
assert {"code": "it"} in data["submission"]["languages"]
assert {"code": "en"} in data["submission"]["languages"]
assert len(data["submission"]["tags"]) == 2
assert {"name": "python"} in data["submission"]["tags"]
assert {"name": "GraphQL"} in data["submission"]["tags"]

# ✔️ private
assert data["submission"]["speakerLevel"] == submission.speaker_level
Expand Down Expand Up @@ -263,14 +255,12 @@ def test_ranked_submission_user_can_see_public_and_restricted_fields(
assert data["submission"]["type"]["name"] == submission.type.name
assert data["submission"]["duration"]["name"] == submission.duration.name
assert data["submission"]["audienceLevel"]["name"] == submission.audience_level.name
assert data["submission"]["languages"] == [
{"code": "it"},
{"code": "en"},
]
assert data["submission"]["tags"] == [
{"name": "python"},
{"name": "GraphQL"},
]
assert len(data["submission"]["languages"]) == 2
assert {"code": "it"} in data["submission"]["languages"]
assert {"code": "en"} in data["submission"]["languages"]
assert len(data["submission"]["tags"]) == 2
assert {"name": "python"} in data["submission"]["tags"]
assert {"name": "GraphQL"} in data["submission"]["tags"]

# ❌ private
assert data["submission"]["speakerLevel"] is None
Expand Down
16 changes: 16 additions & 0 deletions backend/api/tests/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

import pytest
from django.test import Client as DjangoTestClient
from wagtail.models import Locale
from wagtail.coreutils import get_supported_content_language_variant
from django.conf import settings


def query_wrapper(original):
Expand Down Expand Up @@ -82,3 +85,16 @@ def admin_graphql_client(graphql_client):
admin_user = UserFactory(is_staff=True, is_superuser=True)
graphql_client.force_login(admin_user)
return graphql_client


@pytest.fixture(autouse=True)
def create_languages(db):
from languages.models import Language
from languages.languages import LANGUAGES

for language in LANGUAGES:
Language.objects.create(name=language["English"], code=language["alpha2"])

Locale.objects.create(
language_code=get_supported_content_language_variant(settings.LANGUAGE_CODE),
)
Loading

1 comment on commit b2b63f1

@vercel
Copy link

@vercel vercel bot commented on b2b63f1 Jan 27, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.