File: test_cloud_settings.py

package info (click to toggle)
azure-kusto-python 5.0.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,704 kB
  • sloc: python: 10,633; sh: 13; makefile: 3
file content (105 lines) | stat: -rw-r--r-- 4,692 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License
import pytest

from azure.kusto.data._cloud_settings import CloudSettings, CloudInfo


@pytest.fixture
def clear_cache():
    """Fixture to clear the CloudSettings cache before each test"""
    with CloudSettings._cloud_cache_lock:
        CloudSettings._cloud_cache.clear()
    yield
    # Clean up after test if needed
    with CloudSettings._cloud_cache_lock:
        CloudSettings._cloud_cache.clear()


def test_normalize_uri_extracts_authority():
    """Test that _normalize_uri extracts only the authority part (schema, host, port) from a URI."""
    # Test with various URI formats
    test_cases = [
        ("https://cluster.kusto.windows.net", "https://cluster.kusto.windows.net"),
        ("https://cluster.kusto.windows.net/", "https://cluster.kusto.windows.net"),
        ("https://cluster.kusto.windows.net/v1/rest", "https://cluster.kusto.windows.net"),
        ("https://cluster.kusto.windows.net:443/v1/rest", "https://cluster.kusto.windows.net:443"),
        ("http://localhost:8080/v1/rest/query", "http://localhost:8080"),
        ("https://cluster.kusto.windows.net/database", "https://cluster.kusto.windows.net"),
    ]

    for input_uri, expected_authority in test_cases:
        assert CloudSettings._normalize_uri(input_uri) == expected_authority


def test_cloud_info_cached_by_authority(clear_cache):
    """Test that CloudInfo is cached by authority part of the URI (schema, host, port)."""
    # Create a test CloudInfo object
    test_cloud_info = CloudInfo(
        login_endpoint="https://login.test.com",
        login_mfa_required=False,
        kusto_client_app_id="test-app-id",
        kusto_client_redirect_uri="http://localhost/redirect",
        kusto_service_resource_id="https://test.kusto.windows.net",
        first_party_authority_url="https://login.test.com/tenant-id",
    )

    # Add to cache with a specific URL
    base_url = "https://cluster.kusto.windows.net"
    CloudSettings.add_to_cache(base_url, test_cloud_info)

    # Test that it can be retrieved with different path variations but same authority
    variations = [
        base_url + "/",
        base_url + "/database",
        base_url + "/v1/rest/query",
        base_url + "/some/other/path",
    ]

    for url in variations:
        # Use the internal _normalize_uri to get the cache key
        normalized_url = CloudSettings._normalize_uri(url)
        assert normalized_url == "https://cluster.kusto.windows.net"
        assert normalized_url in CloudSettings._cloud_cache

        # Verify the retrieved CloudInfo is the same instance
        retrieved_info = CloudSettings._cloud_cache[normalized_url]
        assert retrieved_info is test_cloud_info


def test_cloud_info_cached_with_port(clear_cache):
    """Test that URIs with ports are cached separately from those without."""
    # Create two different CloudInfo objects
    cloud_info_default = CloudInfo(
        login_endpoint="https://login.default.com",
        login_mfa_required=False,
        kusto_client_app_id="default-app-id",
        kusto_client_redirect_uri="http://localhost/redirect",
        kusto_service_resource_id="https://default.kusto.windows.net",
        first_party_authority_url="https://login.default.com/tenant-id",
    )

    cloud_info_with_port = CloudInfo(
        login_endpoint="https://login.withport.com",
        login_mfa_required=True,
        kusto_client_app_id="port-app-id",
        kusto_client_redirect_uri="http://localhost/redirect",
        kusto_service_resource_id="https://port.kusto.windows.net",
        first_party_authority_url="https://login.withport.com/tenant-id",
    )

    # Add both to cache with different authorities
    CloudSettings.add_to_cache("https://cluster.kusto.windows.net", cloud_info_default)
    CloudSettings.add_to_cache("https://cluster.kusto.windows.net:443", cloud_info_with_port)

    # Verify they are cached separately
    assert "https://cluster.kusto.windows.net" in CloudSettings._cloud_cache
    assert "https://cluster.kusto.windows.net:443" in CloudSettings._cloud_cache

    # Verify each URI gets the correct CloudInfo
    assert CloudSettings._cloud_cache["https://cluster.kusto.windows.net"] is cloud_info_default
    assert CloudSettings._cloud_cache["https://cluster.kusto.windows.net:443"] is cloud_info_with_port

    # Additional verification with variations
    assert CloudSettings._cloud_cache[CloudSettings._normalize_uri("https://cluster.kusto.windows.net/database")] is cloud_info_default
    assert CloudSettings._cloud_cache[CloudSettings._normalize_uri("https://cluster.kusto.windows.net:443/database")] is cloud_info_with_port