/ test / utils / test_auth.py
test_auth.py
 1  # SPDX-FileCopyrightText: 2022-present deepset GmbH <info@deepset.ai>
 2  #
 3  # SPDX-License-Identifier: Apache-2.0
 4  
 5  import os
 6  from dataclasses import FrozenInstanceError
 7  
 8  import pytest
 9  
10  from haystack.utils.auth import EnvVarSecret, Secret, SecretType, TokenSecret
11  
12  
13  def test_secret_type():
14      for e in SecretType:
15          assert e == SecretType.from_str(e.value)
16  
17      with pytest.raises(ValueError, match="Unknown secret type"):
18          SecretType.from_str("disk")
19  
20  
21  def test_token_secret():
22      secret = Secret.from_token("test-token")
23      assert secret.type == SecretType.TOKEN
24      assert isinstance(secret, TokenSecret)
25      assert secret._token == "test-token"
26      assert secret.resolve_value() == "test-token"
27  
28      with pytest.raises(ValueError, match="Cannot serialize token-based secret"):
29          secret.to_dict()
30  
31      with pytest.raises(ValueError, match="cannot be empty"):
32          Secret.from_token("")
33  
34      with pytest.raises(FrozenInstanceError):
35          secret._token = "abba"
36      with pytest.raises(FrozenInstanceError):
37          secret._type = SecretType.ENV_VAR
38  
39  
40  def test_env_var_secret():
41      secret = Secret.from_env_var("TEST_ENV_VAR1")
42      os.environ["TEST_ENV_VAR1"] = "test-token"
43  
44      assert secret.type == SecretType.ENV_VAR
45      assert isinstance(secret, EnvVarSecret)
46      assert secret._env_vars == ("TEST_ENV_VAR1",)
47      assert secret._strict is True
48      assert secret.resolve_value() == "test-token"
49  
50      del os.environ["TEST_ENV_VAR1"]
51      with pytest.raises(ValueError, match="None of the following .* variables are set"):
52          secret.resolve_value()
53  
54      secret = Secret.from_env_var("TEST_ENV_VAR2", strict=False)
55      assert secret._strict is False
56      assert secret.resolve_value() == None
57  
58      secret = Secret.from_env_var(["TEST_ENV_VAR2", "TEST_ENV_VAR1"], strict=True)
59      assert secret._env_vars == ("TEST_ENV_VAR2", "TEST_ENV_VAR1")
60      with pytest.raises(ValueError, match="None of the following .* variables are set"):
61          secret.resolve_value()
62      os.environ["TEST_ENV_VAR1"] = "test-token-2"
63      assert secret.resolve_value() == "test-token-2"
64      os.environ["TEST_ENV_VAR2"] = "test-token"
65      assert secret.resolve_value() == "test-token"
66  
67      with pytest.raises(ValueError, match="One or more environment variables"):
68          Secret.from_env_var([])
69  
70      assert secret.to_dict() == {"type": "env_var", "env_vars": ["TEST_ENV_VAR2", "TEST_ENV_VAR1"], "strict": True}
71      assert (
72          Secret.from_dict({"type": "env_var", "env_vars": ["TEST_ENV_VAR2", "TEST_ENV_VAR1"], "strict": True}) == secret
73      )
74  
75      with pytest.raises(FrozenInstanceError):
76          secret._env_vars = ("A", "B")
77      with pytest.raises(FrozenInstanceError):
78          secret._strict = False
79      with pytest.raises(FrozenInstanceError):
80          secret._type = SecretType.TOKEN