File: test_migrations.py

package info (click to toggle)
djangorestframework-api-key 3.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 392 kB
  • sloc: python: 926; makefile: 53; sh: 3
file content (75 lines) | stat: -rw-r--r-- 2,498 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from typing import Any, Tuple

import pytest

try:
    from django_test_migrations.migrator import Migrator
except ImportError:  # pragma: no cover
    # Most likely Django < 3.2
    Migrator = None  # type: ignore

pytestmark = pytest.mark.skipif(
    Migrator is None,
    reason="django-test-migrations is not available",
)


@pytest.mark.django_db
def test_migrations_0001_initial(migrator: Migrator) -> None:
    old_state = migrator.apply_initial_migration(("rest_framework_api_key", None))

    with pytest.raises(LookupError):
        old_state.apps.get_model("rest_framework_api_key", "APIKey")

    new_state = migrator.apply_tested_migration(
        ("rest_framework_api_key", "0001_initial")
    )
    APIKey = new_state.apps.get_model("rest_framework_api_key", "APIKey")
    assert APIKey.objects.count() == 0


@pytest.mark.django_db
def test_migrations_0004_prefix_hashed_key(migrator: Migrator) -> None:
    from django.contrib.auth.hashers import make_password
    from django.utils.crypto import get_random_string

    def _generate() -> Tuple[str, str]:
        # Replicate bejavior before PR #62 (i.e. before v1.4).
        prefix = get_random_string(8)
        secret_key = get_random_string(32)
        key = prefix + "." + secret_key
        key_id = prefix + "." + make_password(key)
        return key, key_id

    def _assign_key(obj: Any) -> None:
        # Replicate bejavior before PR #62 (i.e. before v1.4).
        _, hashed_key = _generate()
        pk = hashed_key
        prefix, _, hashed_key = hashed_key.partition(".")

        obj.id = pk
        obj.prefix = prefix
        obj.hashed_key = hashed_key

    old_state = migrator.apply_initial_migration(
        ("rest_framework_api_key", "0003_auto_20190623_1952")
    )

    APIKey = old_state.apps.get_model("rest_framework_api_key", "APIKey")

    # Create a key as it if were created before PR #62 (i.e. before v1.4).
    api_key = APIKey.objects.create(name="test")
    _assign_key(api_key)
    api_key.save()
    prefix, _, hashed_key = api_key.id.partition(".")

    # Apply migration added by PR #62.
    new_state = migrator.apply_tested_migration(
        ("rest_framework_api_key", "0004_prefix_hashed_key")
    )
    APIKey = new_state.apps.get_model("rest_framework_api_key", "APIKey")

    # Ensure new `prefix`` and `hashed_key` fields were successfully populated.
    api_key = APIKey.objects.get(id=api_key.id)
    assert api_key.prefix == prefix
    assert api_key.hashed_key == hashed_key