Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 141 additions & 128 deletions test/test_auth.py
Original file line number Diff line number Diff line change
@@ -1,133 +1,146 @@
import os.path
import unittest
from pathlib import Path

import pytest
import requests_mock

import tableauserverclient as TSC

TEST_ASSET_DIR = os.path.join(os.path.dirname(__file__), "assets")

SIGN_IN_XML = os.path.join(TEST_ASSET_DIR, "auth_sign_in.xml")
SIGN_IN_IMPERSONATE_XML = os.path.join(TEST_ASSET_DIR, "auth_sign_in_impersonate.xml")
SIGN_IN_ERROR_XML = os.path.join(TEST_ASSET_DIR, "auth_sign_in_error.xml")


class AuthTests(unittest.TestCase):
def setUp(self):
self.server = TSC.Server("http://test", False)
self.baseurl = self.server.auth.baseurl

def test_sign_in(self):
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(self.baseurl + "/signin", text=response_xml)
tableau_auth = TSC.TableauAuth("testuser", "password", site_id="Samples")
self.server.auth.sign_in(tableau_auth)

self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
self.assertEqual("Samples", self.server.site_url)
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)

def test_sign_in_with_personal_access_tokens(self):
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(self.baseurl + "/signin", text=response_xml)
tableau_auth = TSC.PersonalAccessTokenAuth(
token_name="mytoken", personal_access_token="Random123Generated", site_id="Samples"
)
self.server.auth.sign_in(tableau_auth)

self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
self.assertEqual("Samples", self.server.site_url)
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)

def test_sign_in_impersonate(self):
with open(SIGN_IN_IMPERSONATE_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(self.baseurl + "/signin", text=response_xml)
tableau_auth = TSC.TableauAuth(
"testuser", "password", user_id_to_impersonate="dd2239f6-ddf1-4107-981a-4cf94e415794"
)
self.server.auth.sign_in(tableau_auth)

self.assertEqual("MJonFA6HDyy2C3oqR13fRGqE6cmgzwq3", self.server.auth_token)
self.assertEqual("dad65087-b08b-4603-af4e-2887b8aafc67", self.server.site_id)
self.assertEqual("dd2239f6-ddf1-4107-981a-4cf94e415794", self.server.user_id)

def test_sign_in_error(self):
with open(SIGN_IN_ERROR_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(self.baseurl + "/signin", text=response_xml, status_code=401)
tableau_auth = TSC.TableauAuth("testuser", "wrongpassword")
self.assertRaises(TSC.FailedSignInError, self.server.auth.sign_in, tableau_auth)

def test_sign_in_invalid_token(self):
with open(SIGN_IN_ERROR_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(self.baseurl + "/signin", text=response_xml, status_code=401)
tableau_auth = TSC.PersonalAccessTokenAuth(token_name="mytoken", personal_access_token="invalid")
self.assertRaises(TSC.FailedSignInError, self.server.auth.sign_in, tableau_auth)

def test_sign_in_without_auth(self):
with open(SIGN_IN_ERROR_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(self.baseurl + "/signin", text=response_xml, status_code=401)
tableau_auth = TSC.TableauAuth("", "")
self.assertRaises(TSC.FailedSignInError, self.server.auth.sign_in, tableau_auth)

def test_sign_out(self):
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(self.baseurl + "/signin", text=response_xml)
m.post(self.baseurl + "/signout", text="")
tableau_auth = TSC.TableauAuth("testuser", "password")
self.server.auth.sign_in(tableau_auth)
self.server.auth.sign_out()

self.assertIsNone(self.server._auth_token)
self.assertIsNone(self.server._site_id)
self.assertIsNone(self.server._site_url)
self.assertIsNone(self.server._user_id)

def test_switch_site(self):
self.server.version = "2.6"
baseurl = self.server.auth.baseurl
site_id, user_id, auth_token = list("123")
self.server._set_auth(site_id, user_id, auth_token)
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(baseurl + "/switchSite", text=response_xml)
site = TSC.SiteItem("Samples", "Samples")
self.server.auth.switch_site(site)

self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
self.assertEqual("Samples", self.server.site_url)
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)

def test_revoke_all_server_admin_tokens(self):
self.server.version = "3.10"
baseurl = self.server.auth.baseurl
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(baseurl + "/signin", text=response_xml)
m.post(baseurl + "/revokeAllServerAdminTokens", text="")
tableau_auth = TSC.TableauAuth("testuser", "password")
self.server.auth.sign_in(tableau_auth)
self.server.auth.revoke_all_server_admin_tokens()

self.assertEqual("eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l", self.server.auth_token)
self.assertEqual("6b7179ba-b82b-4f0f-91ed-812074ac5da6", self.server.site_id)
self.assertEqual("Samples", self.server.site_url)
self.assertEqual("1a96d216-e9b8-497b-a82a-0b899a965e01", self.server.user_id)
TEST_ASSET_DIR = Path(__file__).parent / "assets"

SIGN_IN_XML = TEST_ASSET_DIR / "auth_sign_in.xml"
SIGN_IN_IMPERSONATE_XML = TEST_ASSET_DIR / "auth_sign_in_impersonate.xml"
SIGN_IN_ERROR_XML = TEST_ASSET_DIR / "auth_sign_in_error.xml"


@pytest.fixture(scope="function")
def server() -> TSC.Server:
"""Fixture to create a Tableau Server instance for testing."""
server_instance = TSC.Server("http://test", False)
return server_instance


def test_sign_in(server: TSC.Server) -> None:
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(server.auth.baseurl + "/signin", text=response_xml)
tableau_auth = TSC.TableauAuth("testuser", "password", site_id="Samples")
server.auth.sign_in(tableau_auth)

assert "eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l" == server.auth_token
assert "6b7179ba-b82b-4f0f-91ed-812074ac5da6" == server.site_id
assert "Samples" == server.site_url
assert "1a96d216-e9b8-497b-a82a-0b899a965e01" == server.user_id


def test_sign_in_with_personal_access_tokens(server: TSC.Server) -> None:
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(server.auth.baseurl + "/signin", text=response_xml)
tableau_auth = TSC.PersonalAccessTokenAuth(
token_name="mytoken", personal_access_token="Random123Generated", site_id="Samples"
)
server.auth.sign_in(tableau_auth)

assert "eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l" == server.auth_token
assert "6b7179ba-b82b-4f0f-91ed-812074ac5da6" == server.site_id
assert "Samples" == server.site_url
assert "1a96d216-e9b8-497b-a82a-0b899a965e01" == server.user_id


def test_sign_in_impersonate(server: TSC.Server) -> None:
with open(SIGN_IN_IMPERSONATE_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(server.auth.baseurl + "/signin", text=response_xml)
tableau_auth = TSC.TableauAuth(
"testuser", "password", user_id_to_impersonate="dd2239f6-ddf1-4107-981a-4cf94e415794"
)
server.auth.sign_in(tableau_auth)

assert "MJonFA6HDyy2C3oqR13fRGqE6cmgzwq3" == server.auth_token
assert "dad65087-b08b-4603-af4e-2887b8aafc67" == server.site_id
assert "dd2239f6-ddf1-4107-981a-4cf94e415794" == server.user_id


def test_sign_in_error(server: TSC.Server) -> None:
with open(SIGN_IN_ERROR_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(server.auth.baseurl + "/signin", text=response_xml, status_code=401)
tableau_auth = TSC.TableauAuth("testuser", "wrongpassword")
with pytest.raises(TSC.FailedSignInError):
server.auth.sign_in(tableau_auth)


def test_sign_in_invalid_token(server: TSC.Server) -> None:
with open(SIGN_IN_ERROR_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(server.auth.baseurl + "/signin", text=response_xml, status_code=401)
tableau_auth = TSC.PersonalAccessTokenAuth(token_name="mytoken", personal_access_token="invalid")
with pytest.raises(TSC.FailedSignInError):
server.auth.sign_in(tableau_auth)


def test_sign_in_without_auth(server: TSC.Server) -> None:
with open(SIGN_IN_ERROR_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(server.auth.baseurl + "/signin", text=response_xml, status_code=401)
tableau_auth = TSC.TableauAuth("", "")
with pytest.raises(TSC.FailedSignInError):
server.auth.sign_in(tableau_auth)


def test_sign_out(server: TSC.Server) -> None:
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(server.auth.baseurl + "/signin", text=response_xml)
m.post(server.auth.baseurl + "/signout", text="")
tableau_auth = TSC.TableauAuth("testuser", "password")
server.auth.sign_in(tableau_auth)
server.auth.sign_out()

assert server._auth_token is None
assert server._site_id is None
assert server._site_url is None
assert server._user_id is None


def test_switch_site(server: TSC.Server) -> None:
server.version = "2.6"
baseurl = server.auth.baseurl
site_id, user_id, auth_token = list("123")
server._set_auth(site_id, user_id, auth_token)
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(baseurl + "/switchSite", text=response_xml)
site = TSC.SiteItem("Samples", "Samples")
server.auth.switch_site(site)

assert "eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l" == server.auth_token
assert "6b7179ba-b82b-4f0f-91ed-812074ac5da6" == server.site_id
assert "Samples" == server.site_url
assert "1a96d216-e9b8-497b-a82a-0b899a965e01" == server.user_id


def test_revoke_all_server_admin_tokens(server: TSC.Server) -> None:
server.version = "3.10"
baseurl = server.auth.baseurl
with open(SIGN_IN_XML, "rb") as f:
response_xml = f.read().decode("utf-8")
with requests_mock.mock() as m:
m.post(baseurl + "/signin", text=response_xml)
m.post(baseurl + "/revokeAllServerAdminTokens", text="")
tableau_auth = TSC.TableauAuth("testuser", "password")
server.auth.sign_in(tableau_auth)
server.auth.revoke_all_server_admin_tokens()

assert "eIX6mvFsqyansa4KqEI1UwOpS8ggRs2l" == server.auth_token
assert "6b7179ba-b82b-4f0f-91ed-812074ac5da6" == server.site_id
assert "Samples" == server.site_url
assert "1a96d216-e9b8-497b-a82a-0b899a965e01" == server.user_id
Loading