import pytest
|
from jwt_auth.models import LSAPIToken
|
from organizations.functions import create_organization
|
from rest_framework import status
|
from rest_framework.authtoken.models import Token
|
from rest_framework.test import APIClient
|
from users.models import User
|
|
from ..utils import mock_feature_flag
|
from .utils import create_user_with_token_settings
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_request_without_auth_header_returns_401():
|
client = APIClient()
|
response = client.get('/api/projects/')
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_request_with_invalid_token_returns_401():
|
client = APIClient()
|
client.credentials(HTTP_AUTHORIZATION='Bearer invalid.token.here')
|
response = client.get('/api/projects/')
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_request_with_valid_token_returns_authenticated_user():
|
user = create_user_with_token_settings(api_tokens_enabled=True, legacy_api_tokens_enabled=False)
|
refresh = LSAPIToken.for_user(user)
|
client = APIClient()
|
client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
|
|
response = client.get('/api/projects/')
|
|
assert response.status_code == status.HTTP_200_OK
|
assert response.wsgi_request.user == user
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_jwt_token_auth_disabled_user_cannot_use_jwt_token():
|
user = create_user_with_token_settings(api_tokens_enabled=False, legacy_api_tokens_enabled=True)
|
refresh = LSAPIToken.for_user(user)
|
client = APIClient()
|
client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
|
|
response = client.get('/api/projects/')
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_user_with_both_auth_enabled_can_use_both_methods():
|
user = create_user_with_token_settings(api_tokens_enabled=True, legacy_api_tokens_enabled=True)
|
client = APIClient()
|
|
# JWT token auth
|
refresh = LSAPIToken.for_user(user)
|
client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
|
|
response = client.get('/api/projects/')
|
|
assert response.status_code == status.HTTP_200_OK
|
assert response.wsgi_request.user == user
|
|
# Legacy token auth
|
token, _ = Token.objects.get_or_create(user=user)
|
client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
|
|
response = client.get('/api/projects/')
|
|
assert response.status_code == status.HTTP_200_OK
|
assert response.wsgi_request.user == user
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_user_with_no_auth_enabled_cannot_use_either_method():
|
user = create_user_with_token_settings(api_tokens_enabled=False, legacy_api_tokens_enabled=False)
|
client = APIClient()
|
|
# JWT token auth
|
refresh = LSAPIToken.for_user(user)
|
client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
|
|
response = client.get('/api/projects/')
|
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
# Legacy token auth
|
token, _ = Token.objects.get_or_create(user=user)
|
client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
|
|
response = client.get('/api/projects/')
|
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_jwt_token_invalid_after_user_deleted():
|
user = create_user_with_token_settings(api_tokens_enabled=True, legacy_api_tokens_enabled=False)
|
refresh = LSAPIToken.for_user(user)
|
client = APIClient()
|
client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
|
# Verify token works before deleting user
|
response = client.get('/api/projects/')
|
assert response.status_code == status.HTTP_200_OK
|
assert response.wsgi_request.user == user
|
|
user.delete()
|
|
response = client.get('/api/projects/')
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
@mock_feature_flag(flag_name='fflag__feature_develop__prompts__dia_1829_jwt_token_auth', value=True)
|
@pytest.mark.django_db
|
def test_user_with_default_auth_settings_can_use_jwt_but_not_legacy_token():
|
# Create user and org with default settings from create_organization
|
user = User.objects.create(email='default_auth_settings@example.com')
|
org = create_organization(title='Default Settings Org', created_by=user)
|
user.active_organization = org
|
user.save()
|
|
# JWT token auth should work (enabled by default)
|
refresh = LSAPIToken.for_user(user)
|
client = APIClient()
|
client.credentials(HTTP_AUTHORIZATION=f'Bearer {refresh.access_token}')
|
|
response = client.get('/api/projects/')
|
assert response.status_code == status.HTTP_200_OK
|
assert response.wsgi_request.user == user
|
|
# Legacy token auth should not work (disabled by default)
|
token, _ = Token.objects.get_or_create(user=user)
|
client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
|
|
response = client.get('/api/projects/')
|
assert response.status_code == status.HTTP_401_UNAUTHORIZED
|