58 lines
1.3 KiB
Python
58 lines
1.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# type: ignore
|
|
from __future__ import annotations
|
|
|
|
from unittest import mock
|
|
|
|
import pytest
|
|
from pytest_mock import MockFixture
|
|
|
|
from keep_it_secret import secrets
|
|
from keep_it_secret.secrets import Secrets
|
|
|
|
|
|
class TestingSecrets(Secrets):
|
|
pass
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_field(mocker: MockFixture) -> mock.Mock:
|
|
result = mocker.Mock(return_value='spam')
|
|
result.description = None
|
|
|
|
return result
|
|
|
|
|
|
@pytest.fixture
|
|
def testing_secrets() -> TestingSecrets:
|
|
yield TestingSecrets()
|
|
|
|
TestingSecrets.__secrets_fields__ = {}
|
|
|
|
|
|
def test_getter_cache_miss(mock_field: mock.Mock, testing_secrets: TestingSecrets):
|
|
# Given
|
|
testing_secrets.__secrets_fields__['spam'] = mock_field
|
|
|
|
# When
|
|
result = secrets.field_property_factory('spam', mock_field).fget(testing_secrets)
|
|
|
|
# Then
|
|
assert result == 'spam'
|
|
|
|
mock_field.assert_called_once_with(testing_secrets)
|
|
|
|
|
|
def test_getter_cache_hit(mock_field: mock.Mock, testing_secrets: TestingSecrets):
|
|
# Given
|
|
testing_secrets.__secrets_fields__['spam'] = mock_field
|
|
testing_secrets.__secrets_data__['spam'] = 'eggs'
|
|
|
|
# When
|
|
result = secrets.field_property_factory('spam', mock_field).fget(testing_secrets)
|
|
|
|
# Then
|
|
assert result == 'eggs'
|
|
|
|
mock_field.assert_not_called()
|