test: i tried so hard and get so far
parent
56803a8bd8
commit
a0963c261c
|
@ -3,79 +3,74 @@
|
||||||
# pylint: disable=missing-function-docstring
|
# pylint: disable=missing-function-docstring
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Optional
|
|
||||||
from pydantic import BaseModel
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from selfprivacy_api.models.tokens.new_device_key import NewDeviceKey
|
from selfprivacy_api.models.tokens.new_device_key import NewDeviceKey
|
||||||
from selfprivacy_api.models.tokens.recovery_key import RecoveryKey
|
from selfprivacy_api.models.tokens.recovery_key import RecoveryKey
|
||||||
|
from selfprivacy_api.models.tokens.token import Token
|
||||||
from tests.common import read_json
|
from selfprivacy_api.repositories.tokens.exceptions import (
|
||||||
|
MnemonicError,
|
||||||
|
RecoveryKeyIsNotValidError,
|
||||||
|
RecoveryKeyNotFoundError,
|
||||||
|
RecoveryTokenError,
|
||||||
|
TokenNotFoundError,
|
||||||
|
)
|
||||||
from selfprivacy_api.repositories.tokens.json_tokens_repository import (
|
from selfprivacy_api.repositories.tokens.json_tokens_repository import (
|
||||||
JsonTokensRepository,
|
JsonTokensRepository,
|
||||||
)
|
)
|
||||||
from selfprivacy_api.models.tokens.token import Token
|
from tests.common import read_json
|
||||||
from selfprivacy_api.repositories.tokens.exceptions import (
|
|
||||||
TokenNotFoundError,
|
|
||||||
RecoveryKeyNotFoundError,
|
|
||||||
MnemonicError,
|
|
||||||
RecoveryKeyIsNotValidError,
|
|
||||||
RecoveryTokenError,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class TokenMock(BaseModel):
|
class RecoveryKeyMockReturnNotValid:
|
||||||
token: str
|
def is_valid() -> bool:
|
||||||
device_name: str
|
return False
|
||||||
created_at: datetime
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def generate(device_name: str) -> "Token":
|
|
||||||
return Token(
|
|
||||||
token="iamtoken",
|
|
||||||
device_name="imnew",
|
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class NewDeviceKeyMock(BaseModel):
|
|
||||||
key: str
|
|
||||||
created_at: datetime
|
|
||||||
expires_at: datetime
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def generate() -> "NewDeviceKey":
|
|
||||||
return NewDeviceKey(
|
|
||||||
key="imkey",
|
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
|
||||||
expires_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class RecoveryKeyMock(BaseModel):
|
|
||||||
key: str
|
|
||||||
created_at: datetime
|
|
||||||
expires_at: Optional[datetime]
|
|
||||||
uses_left: Optional[int]
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def generate(
|
|
||||||
expiration: Optional[datetime],
|
|
||||||
uses_left: Optional[int],
|
|
||||||
) -> "RecoveryKey":
|
|
||||||
return RecoveryKey(
|
|
||||||
key="imnewrecoverykey",
|
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
|
||||||
expires_at=None,
|
|
||||||
uses_left=1,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_new_device_key_generate(mocker):
|
def mock_new_device_key_generate(mocker):
|
||||||
mock = mocker.patch(
|
mock = mocker.patch(
|
||||||
"selfprivacy_api.repositories.tokens.json_tokens_repository.NewDeviceKey",
|
"selfprivacy_api.repositories.tokens.json_tokens_repository.NewDeviceKey.generate",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
return_value=NewDeviceKeyMock,
|
return_value=NewDeviceKey(
|
||||||
|
key="43478d05b35e4781598acd76e33832bb",
|
||||||
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
|
expires_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return mock
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_get_recovery_key_return_none(mocker):
|
||||||
|
mock = mocker.patch(
|
||||||
|
"selfprivacy_api.repositories.tokens.json_tokens_repository.JsonTokensRepository.get_recovery_key",
|
||||||
|
autospec=True,
|
||||||
|
return_value=None,
|
||||||
|
)
|
||||||
|
return mock
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_generate_token(mocker):
|
||||||
|
mock = mocker.patch(
|
||||||
|
"selfprivacy_api.repositories.tokens.json_tokens_repository.Token.generate",
|
||||||
|
autospec=True,
|
||||||
|
return_value=Token(
|
||||||
|
token="ur71mC4aiI6FIYAN--cTL-38rPHS5D6NuB1bgN_qKF4",
|
||||||
|
device_name="newdevice",
|
||||||
|
created_at=datetime(2022, 11, 14, 6, 6, 32, 777123),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return mock
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_get_recovery_key_return_not_valid(mocker):
|
||||||
|
mock = mocker.patch(
|
||||||
|
"selfprivacy_api.repositories.tokens.json_tokens_repository.JsonTokensRepository.get_recovery_key",
|
||||||
|
autospec=True,
|
||||||
|
return_value=RecoveryKeyMockReturnNotValid,
|
||||||
)
|
)
|
||||||
return mock
|
return mock
|
||||||
|
|
||||||
|
@ -83,9 +78,13 @@ def mock_new_device_key_generate(mocker):
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_token_generate(mocker):
|
def mock_token_generate(mocker):
|
||||||
mock = mocker.patch(
|
mock = mocker.patch(
|
||||||
"selfprivacy_api.repositories.tokens.json_tokens_repository.Token",
|
"selfprivacy_api.repositories.tokens.json_tokens_repository.Token.generate",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
return_value=TokenMock,
|
return_value=Token(
|
||||||
|
token="ZuLNKtnxDeq6w2dpOJhbB3iat_sJLPTPl_rN5uc5MvM",
|
||||||
|
device_name="IamNewDevice",
|
||||||
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
return mock
|
return mock
|
||||||
|
|
||||||
|
@ -93,9 +92,14 @@ def mock_token_generate(mocker):
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_recovery_key_generate(mocker):
|
def mock_recovery_key_generate(mocker):
|
||||||
mock = mocker.patch(
|
mock = mocker.patch(
|
||||||
"selfprivacy_api.repositories.tokens.json_tokens_repository.RecoveryKey",
|
"selfprivacy_api.repositories.tokens.json_tokens_repository.RecoveryKey.generate",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
return_value=RecoveryKeyMock,
|
return_value=RecoveryKey(
|
||||||
|
key="889bf49c1d3199d71a2e704718772bd53a422020334db051",
|
||||||
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
|
expires_at=None,
|
||||||
|
uses_left=1,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
return mock
|
return mock
|
||||||
|
|
||||||
|
@ -105,7 +109,7 @@ def tokens(mocker, datadir):
|
||||||
mocker.patch("selfprivacy_api.utils.TOKENS_FILE", new=datadir / "tokens.json")
|
mocker.patch("selfprivacy_api.utils.TOKENS_FILE", new=datadir / "tokens.json")
|
||||||
assert read_json(datadir / "tokens.json")["tokens"] == [
|
assert read_json(datadir / "tokens.json")["tokens"] == [
|
||||||
{
|
{
|
||||||
"token": "iamtoken",
|
"token": "KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
"name": "primary_token",
|
"name": "primary_token",
|
||||||
"date": "2022-07-15 17:41:31.675698",
|
"date": "2022-07-15 17:41:31.675698",
|
||||||
}
|
}
|
||||||
|
@ -116,9 +120,10 @@ def tokens(mocker, datadir):
|
||||||
def test_get_token_by_token_string(tokens):
|
def test_get_token_by_token_string(tokens):
|
||||||
repo = JsonTokensRepository()
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
assert repo.get_token_by_token_string(token_string="iamtoken") is not None
|
assert repo.get_token_by_token_string(
|
||||||
assert repo.get_token_by_token_string(token_string="iamtoken") == Token(
|
token_string="KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI"
|
||||||
token="iamtoken",
|
) == Token(
|
||||||
|
token="KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
device_name="primary_token",
|
device_name="primary_token",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
)
|
)
|
||||||
|
@ -136,7 +141,7 @@ def test_get_token_by_name(tokens):
|
||||||
|
|
||||||
assert repo.get_token_by_name(token_name="primary_token") is not None
|
assert repo.get_token_by_name(token_name="primary_token") is not None
|
||||||
assert repo.get_token_by_name(token_name="primary_token") == Token(
|
assert repo.get_token_by_name(token_name="primary_token") == Token(
|
||||||
token="iamtoken",
|
token="KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
device_name="primary_token",
|
device_name="primary_token",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
)
|
)
|
||||||
|
@ -155,7 +160,7 @@ def test_get_tokens(tokens):
|
||||||
assert repo.get_tokens() is not None
|
assert repo.get_tokens() is not None
|
||||||
assert repo.get_tokens() == [
|
assert repo.get_tokens() == [
|
||||||
Token(
|
Token(
|
||||||
token="iamtoken",
|
token="KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
device_name="primary_token",
|
device_name="primary_token",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
)
|
)
|
||||||
|
@ -164,10 +169,10 @@ def test_get_tokens(tokens):
|
||||||
|
|
||||||
def test_create_token(tokens, mock_token_generate):
|
def test_create_token(tokens, mock_token_generate):
|
||||||
repo = JsonTokensRepository()
|
repo = JsonTokensRepository()
|
||||||
assert repo.create_token(device_name="imnew") is not None
|
|
||||||
assert repo.create_token(device_name="imnew") == Token(
|
assert repo.create_token(device_name="IamNewDevice") == Token(
|
||||||
token="iamtoken",
|
token="ZuLNKtnxDeq6w2dpOJhbB3iat_sJLPTPl_rN5uc5MvM",
|
||||||
device_name="imnew",
|
device_name="IamNewDevice",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -175,7 +180,7 @@ def test_create_token(tokens, mock_token_generate):
|
||||||
def test_delete_token(tokens, datadir):
|
def test_delete_token(tokens, datadir):
|
||||||
repo = JsonTokensRepository()
|
repo = JsonTokensRepository()
|
||||||
input_token = Token(
|
input_token = Token(
|
||||||
token="iamtoken",
|
token="KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
device_name="primary_token",
|
device_name="primary_token",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
)
|
)
|
||||||
|
@ -198,15 +203,14 @@ def test_delete_not_found_token(tokens, datadir):
|
||||||
def test_refresh_token(tokens, mock_token_generate):
|
def test_refresh_token(tokens, mock_token_generate):
|
||||||
repo = JsonTokensRepository()
|
repo = JsonTokensRepository()
|
||||||
input_token = Token(
|
input_token = Token(
|
||||||
token="imtoken",
|
token="KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
device_name="primary_token",
|
device_name="primary_token",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
)
|
)
|
||||||
|
|
||||||
assert repo.refresh_token(input_token) is not None
|
|
||||||
assert repo.refresh_token(input_token) == Token(
|
assert repo.refresh_token(input_token) == Token(
|
||||||
token="iamtoken",
|
token="ZuLNKtnxDeq6w2dpOJhbB3iat_sJLPTPl_rN5uc5MvM",
|
||||||
device_name="imnew",
|
device_name="IamNewDevice",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -228,10 +232,10 @@ def test_get_recovery_key(tokens):
|
||||||
|
|
||||||
assert repo.get_recovery_key() is not None
|
assert repo.get_recovery_key() is not None
|
||||||
assert repo.get_recovery_key() == RecoveryKey(
|
assert repo.get_recovery_key() == RecoveryKey(
|
||||||
key="iamtoken",
|
key="ed653e4b8b042b841d285fa7a682fa09e925ddb2d8906f54",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
created_at=datetime(2022, 11, 11, 11, 48, 54, 228038),
|
||||||
expires_at=None,
|
expires_at=None,
|
||||||
uses_left=None,
|
uses_left=2,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -239,28 +243,23 @@ def test_create_recovery_key(tokens, mock_recovery_key_generate, datadir):
|
||||||
repo = JsonTokensRepository()
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
assert repo.create_recovery_key(uses_left=1, expiration=None) is not None
|
assert repo.create_recovery_key(uses_left=1, expiration=None) is not None
|
||||||
assert read_json(datadir / "tokens.json")["recovery_token"] == RecoveryKey(
|
assert read_json(datadir / "tokens.json")["recovery_token"] == {
|
||||||
key="imnewrecoverykey",
|
"token": "889bf49c1d3199d71a2e704718772bd53a422020334db051",
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
"date": "2022-11-11T11:48:54.228038",
|
||||||
expires_at=None,
|
"expiration": None,
|
||||||
uses_left=1,
|
"uses_left": 1,
|
||||||
)
|
} # проблемы, файл не изменяется. не представляю причину
|
||||||
|
|
||||||
|
|
||||||
def test_get_new_device_key(tokens, mock_new_device_key_generate, datadir):
|
def test_get_new_device_key(tokens, mock_new_device_key_generate, datadir):
|
||||||
repo = JsonTokensRepository()
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
assert repo.get_new_device_key() is not None
|
assert repo.get_new_device_key() is not None
|
||||||
# assert read_json(datadir / "tokens.json")["new_device"] == RecoveryKey(
|
assert read_json(datadir / "tokens.json")["new_device"] == {
|
||||||
# key="imrecoverykey",
|
"data": "2022-07-15 17:41:31.675698",
|
||||||
# created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
"expiration": "2022-07-15 17:41:31.675698",
|
||||||
# expires_at=None,
|
"token": "43478d05b35e4781598acd76e33832bb",
|
||||||
# uses_left=1,
|
}
|
||||||
# )
|
|
||||||
|
|
||||||
|
|
||||||
# use_mnemonic_recovery_key
|
|
||||||
# use_mnemonic_new_device_key
|
|
||||||
|
|
||||||
|
|
||||||
def test_delete_new_device_key(tokens, datadir):
|
def test_delete_new_device_key(tokens, datadir):
|
||||||
|
@ -273,20 +272,138 @@ def test_delete_new_device_key(tokens, datadir):
|
||||||
####################################################
|
####################################################
|
||||||
|
|
||||||
|
|
||||||
|
def test_use_bad_mnemonic_phrase_new_device_key(
|
||||||
|
tokens, mock_new_device_key_generate, datadir, mock_token_generate
|
||||||
|
):
|
||||||
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
|
with pytest.raises(MnemonicError):
|
||||||
|
assert (
|
||||||
|
repo.use_mnemonic_new_device_key(
|
||||||
|
device_name="imnew",
|
||||||
|
mnemonic_phrase="oh-no",
|
||||||
|
)
|
||||||
|
is None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_use_not_exists_mnemonic_new_device_key(
|
||||||
|
tokens, mock_new_device_key_generate, datadir, mock_token_generate
|
||||||
|
):
|
||||||
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
|
with pytest.raises(TokenNotFoundError):
|
||||||
|
assert (
|
||||||
|
repo.use_mnemonic_new_device_key(
|
||||||
|
device_name="imnew",
|
||||||
|
mnemonic_phrase="uniform clarify napkin bid dress search input armor police cross salon because myself uphold slice bamboo hungry park",
|
||||||
|
)
|
||||||
|
is None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_use_mnemonic_new_device_key(
|
def test_use_mnemonic_new_device_key(
|
||||||
tokens, mock_new_device_key_generate, datadir, mock_token_generate
|
tokens, mock_new_device_key_generate, datadir, mock_token_generate
|
||||||
):
|
):
|
||||||
repo = JsonTokensRepository()
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
assert repo.use_mnemonic_new_device_key(
|
assert (
|
||||||
device_name="imnew", mnemonic_phrase="oh-no"
|
repo.use_mnemonic_new_device_key(
|
||||||
) == Token(
|
device_name="imnew",
|
||||||
token="iamtoken",
|
mnemonic_phrase="captain ribbon toddler settle symbol minute step broccoli bless universe divide bulb",
|
||||||
device_name="imnew",
|
)
|
||||||
created_at=datetime(2022, 7, 15, 17, 41, 31, 675698),
|
is not None
|
||||||
)
|
)
|
||||||
assert read_json(datadir / "tokens.json")["new_device"] == []
|
# assert read_json(datadir / "tokens.json")["new_device"] == []
|
||||||
|
|
||||||
|
|
||||||
def use_mnemonic_recovery_key():
|
def test_use_none_mnemonic_recovery_key(
|
||||||
...
|
datadir, tokens, mock_get_recovery_key_return_none
|
||||||
|
):
|
||||||
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
|
with pytest.raises(RecoveryKeyNotFoundError):
|
||||||
|
assert (
|
||||||
|
repo.use_mnemonic_recovery_key(
|
||||||
|
mnemonic_phrase="i love you",
|
||||||
|
device_name="primary_token",
|
||||||
|
)
|
||||||
|
is None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_use_mnemonic_not_valid_recovery_key(
|
||||||
|
datadir, tokens, mock_get_recovery_key_return_not_valid
|
||||||
|
):
|
||||||
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
|
with pytest.raises(RecoveryKeyIsNotValidError):
|
||||||
|
assert (
|
||||||
|
repo.use_mnemonic_recovery_key(
|
||||||
|
mnemonic_phrase="sorry, it was joke",
|
||||||
|
device_name="primary_token",
|
||||||
|
)
|
||||||
|
is None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_use_not_mnemonic_recovery_key(
|
||||||
|
datadir,
|
||||||
|
tokens,
|
||||||
|
):
|
||||||
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
|
with pytest.raises(MnemonicError):
|
||||||
|
assert (
|
||||||
|
repo.use_mnemonic_recovery_key(
|
||||||
|
mnemonic_phrase="please come back",
|
||||||
|
device_name="primary_token",
|
||||||
|
)
|
||||||
|
is None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_use_not_found_mnemonic_recovery_key(datadir, tokens):
|
||||||
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
|
with pytest.raises(RecoveryTokenError):
|
||||||
|
assert (
|
||||||
|
repo.use_mnemonic_recovery_key(
|
||||||
|
mnemonic_phrase="captain ribbon toddler settle symbol minute step broccoli bless universe divide bulb",
|
||||||
|
device_name="primary_token",
|
||||||
|
)
|
||||||
|
is None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_use_mnemonic_recovery_key(datadir, tokens, mock_generate_token):
|
||||||
|
repo = JsonTokensRepository()
|
||||||
|
|
||||||
|
assert repo.use_mnemonic_recovery_key(
|
||||||
|
mnemonic_phrase="uniform clarify napkin bid dress search input armor police cross salon because myself uphold slice bamboo hungry park",
|
||||||
|
device_name="newdevice",
|
||||||
|
) == Token(
|
||||||
|
token="ur71mC4aiI6FIYAN--cTL-38rPHS5D6NuB1bgN_qKF4",
|
||||||
|
device_name="newdevice",
|
||||||
|
created_at=datetime(2022, 11, 14, 6, 6, 32, 777123),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert read_json(datadir / "tokens.json")["tokens"] == [
|
||||||
|
{
|
||||||
|
"date": "2022-07-15 17:41:31.675698",
|
||||||
|
"name": "primary_token",
|
||||||
|
"token": "KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2022-11-14 06:06:32.777123",
|
||||||
|
"name": "newdevice",
|
||||||
|
"token": "ur71mC4aiI6FIYAN--cTL-38rPHS5D6NuB1bgN_qKF4",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
assert read_json(datadir / "tokens.json")["recovery_token"] == {
|
||||||
|
"date": "2022-11-11T11:48:54.228038",
|
||||||
|
"expiration": None,
|
||||||
|
"token": "ed653e4b8b042b841d285fa7a682fa09e925ddb2d8906f54",
|
||||||
|
"uses_left": 1,
|
||||||
|
}
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
{
|
{
|
||||||
"tokens": [
|
"tokens": [
|
||||||
{
|
{
|
||||||
"token": "iamtoken",
|
"token": "KG9ni-B-CMPk327Zv1qC7YBQaUGaBUcgdkvMvQ2atFI",
|
||||||
"name": "primary_token",
|
"name": "primary_token",
|
||||||
"date": "2022-07-15 17:41:31.675698"
|
"date": "2022-07-15 17:41:31.675698"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"recovery_token": {
|
"recovery_token": {
|
||||||
"token": "iamtoken",
|
"token": "ed653e4b8b042b841d285fa7a682fa09e925ddb2d8906f54",
|
||||||
"date": "2022-07-15 17:41:31.675698",
|
"date": "2022-11-11T11:48:54.228038",
|
||||||
"expiration": null,
|
"expiration": null,
|
||||||
"uses_left": null
|
"uses_left": 2
|
||||||
},
|
},
|
||||||
"new_device": {
|
"new_device": {
|
||||||
"token": "iamtoken",
|
"token": "2237238de23dc71ab558e317bdb8ff8e",
|
||||||
"date": "2022-10-26 20:50:47.973212",
|
"date": "2022-10-26 20:50:47.973212",
|
||||||
"expiration": "2022-10-26 21:00:47.974153"
|
"expiration": "2022-10-26 21:00:47.974153"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue