# -*- 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()