Skip to content

Jam testing

For convenient testing of your services that use Jam, you can easily replace the main Jam instance with a test instance that has the same interface but works according to its own rules (for example, always succeeds).

For example, you have a service for generating JWT tokens.

Tip

For async services, you can use TestAsyncJam instead of TestJam.

from jam import Jam

class AuthService:
    def __init__(
            self,
            jam_instance: Jam
    ) -> None:
        self.jam = jam_instance

    # Generate new token
    def generate_token(self, user: User) -> str:
        payload = self.jam.jwt_make_payload(exp=None, data=user.to_payload())
        token = self.jam.jwt_create_token(payload)
        return token

    # Validate token and return user or None
    def validate_token(self, token) -> User | None:
        try:
            payload = self.jam.jwt_verify_token(
                token, check_exp=True, check_list=False
            )
        except ValueError:
            return None

And you need to write tests for it.

import pytest
from jam.tests import TestJam

from your_app.services import AuthService


@pytest.fixture
def auth_service() -> AuthService:
    return AuthService(
        jam_instance=TestJam()  # Use TestJam instance here
    )

def test_auth_user(auth_service):
    user = User(id=1, username="test_user")
    token = auth_service.generate_token(user)  # Generate token
    assert token is not None

    validated_user = auth_service.validate_token(token)  # Validate token
    assert validated_user is not None
    assert validated_user.id == user.id
    assert validated_user.username == user.username

    # if you want to test invalid token
    from jam.tests.fakers import invalid_token
    invalid_user = auth_service.validate_token(invalid_token())
    assert invalid_user is None