diff --git a/test/test_datasource.py b/test/test_datasource.py index 7f4cca75..56eb11ab 100644 --- a/test/test_datasource.py +++ b/test/test_datasource.py @@ -895,7 +895,8 @@ def test_publish_description(server: TSC.Server) -> None: ds_elem = body.find(".//datasource") assert ds_elem is not None assert ds_elem.attrib["description"] == "Sample description" - + + def test_get_datasource_no_owner(server: TSC.Server) -> None: with requests_mock.mock() as m: m.get(server.datasources.baseurl, text=GET_NO_OWNER.read_text()) diff --git a/test/test_view.py b/test/test_view.py index ee6d518d..e032ed56 100644 --- a/test/test_view.py +++ b/test/test_view.py @@ -1,6 +1,6 @@ -import os -import unittest +from pathlib import Path +import pytest import requests_mock import tableauserverclient as TSC @@ -8,511 +8,515 @@ from tableauserverclient.datetime_helpers import format_datetime, parse_datetime from tableauserverclient.server.endpoint.exceptions import UnsupportedAttributeError -TEST_ASSET_DIR = os.path.join(os.path.dirname(__file__), "assets") - -ADD_TAGS_XML = os.path.join(TEST_ASSET_DIR, "view_add_tags.xml") -GET_XML = os.path.join(TEST_ASSET_DIR, "view_get.xml") -GET_XML_ALL_FIELDS = os.path.join(TEST_ASSET_DIR, "view_get_all_fields.xml") -GET_XML_ID = os.path.join(TEST_ASSET_DIR, "view_get_id.xml") -GET_XML_USAGE = os.path.join(TEST_ASSET_DIR, "view_get_usage.xml") -GET_XML_ID_USAGE = os.path.join(TEST_ASSET_DIR, "view_get_id_usage.xml") -POPULATE_PREVIEW_IMAGE = os.path.join(TEST_ASSET_DIR, "Sample View Image.png") -POPULATE_PDF = os.path.join(TEST_ASSET_DIR, "populate_pdf.pdf") -POPULATE_CSV = os.path.join(TEST_ASSET_DIR, "populate_csv.csv") -POPULATE_EXCEL = os.path.join(TEST_ASSET_DIR, "populate_excel.xlsx") -POPULATE_PERMISSIONS_XML = os.path.join(TEST_ASSET_DIR, "view_populate_permissions.xml") -UPDATE_PERMISSIONS = os.path.join(TEST_ASSET_DIR, "view_update_permissions.xml") -UPDATE_XML = os.path.join(TEST_ASSET_DIR, "workbook_update.xml") - - -class ViewTests(unittest.TestCase): - def setUp(self): - self.server = TSC.Server("http://test", False) - self.server.version = "3.2" - - # Fake sign in - self.server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" - self.server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" - - self.baseurl = self.server.views.baseurl - self.siteurl = self.server.views.siteurl - - def test_get(self) -> None: - with open(GET_XML, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl, text=response_xml) - all_views, pagination_item = self.server.views.get() - - self.assertEqual(2, pagination_item.total_available) - self.assertEqual("d79634e1-6063-4ec9-95ff-50acbf609ff5", all_views[0].id) - self.assertEqual("ENDANGERED SAFARI", all_views[0].name) - self.assertEqual("SafariSample/sheets/ENDANGEREDSAFARI", all_views[0].content_url) - self.assertEqual("3cc6cd06-89ce-4fdc-b935-5294135d6d42", all_views[0].workbook_id) - self.assertEqual("5de011f8-5aa9-4d5b-b991-f462c8dd6bb7", all_views[0].owner_id) - self.assertEqual("5241e88d-d384-4fd7-9c2f-648b5247efc5", all_views[0].project_id) - self.assertEqual({"tag1", "tag2"}, all_views[0].tags) - self.assertIsNone(all_views[0].created_at) - self.assertIsNone(all_views[0].updated_at) - self.assertIsNone(all_views[0].sheet_type) - - self.assertEqual("fd252f73-593c-4c4e-8584-c032b8022adc", all_views[1].id) - self.assertEqual("Overview", all_views[1].name) - self.assertEqual("Superstore/sheets/Overview", all_views[1].content_url) - self.assertEqual("6d13b0ca-043d-4d42-8c9d-3f3313ea3a00", all_views[1].workbook_id) - self.assertEqual("5de011f8-5aa9-4d5b-b991-f462c8dd6bb7", all_views[1].owner_id) - self.assertEqual("5b534f74-3226-11e8-b47a-cb2e00f738a3", all_views[1].project_id) - self.assertEqual("2002-05-30T09:00:00Z", format_datetime(all_views[1].created_at)) - self.assertEqual("2002-06-05T08:00:59Z", format_datetime(all_views[1].updated_at)) - self.assertEqual("story", all_views[1].sheet_type) - - def test_get_by_id(self) -> None: - with open(GET_XML_ID, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5", text=response_xml) - view = self.server.views.get_by_id("d79634e1-6063-4ec9-95ff-50acbf609ff5") - - self.assertEqual("d79634e1-6063-4ec9-95ff-50acbf609ff5", view.id) - self.assertEqual("ENDANGERED SAFARI", view.name) - self.assertEqual("SafariSample/sheets/ENDANGEREDSAFARI", view.content_url) - self.assertEqual("3cc6cd06-89ce-4fdc-b935-5294135d6d42", view.workbook_id) - self.assertEqual("5de011f8-5aa9-4d5b-b991-f462c8dd6bb7", view.owner_id) - self.assertEqual("5241e88d-d384-4fd7-9c2f-648b5247efc5", view.project_id) - self.assertEqual({"tag1", "tag2"}, view.tags) - self.assertEqual("2002-05-30T09:00:00Z", format_datetime(view.created_at)) - self.assertEqual("2002-06-05T08:00:59Z", format_datetime(view.updated_at)) - self.assertEqual("story", view.sheet_type) - - def test_get_by_id_usage(self) -> None: - with open(GET_XML_ID_USAGE, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5?includeUsageStatistics=true", text=response_xml) - view = self.server.views.get_by_id("d79634e1-6063-4ec9-95ff-50acbf609ff5", usage=True) - - self.assertEqual("d79634e1-6063-4ec9-95ff-50acbf609ff5", view.id) - self.assertEqual("ENDANGERED SAFARI", view.name) - self.assertEqual("SafariSample/sheets/ENDANGEREDSAFARI", view.content_url) - self.assertEqual("3cc6cd06-89ce-4fdc-b935-5294135d6d42", view.workbook_id) - self.assertEqual("5de011f8-5aa9-4d5b-b991-f462c8dd6bb7", view.owner_id) - self.assertEqual("5241e88d-d384-4fd7-9c2f-648b5247efc5", view.project_id) - self.assertEqual({"tag1", "tag2"}, view.tags) - self.assertEqual("2002-05-30T09:00:00Z", format_datetime(view.created_at)) - self.assertEqual("2002-06-05T08:00:59Z", format_datetime(view.updated_at)) - self.assertEqual("story", view.sheet_type) - self.assertEqual(7, view.total_views) - - def test_get_by_id_missing_id(self) -> None: - self.assertRaises(TSC.MissingRequiredFieldError, self.server.views.get_by_id, None) - - def test_get_with_usage(self) -> None: - with open(GET_XML_USAGE, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl + "?includeUsageStatistics=true", text=response_xml) - all_views, pagination_item = self.server.views.get(usage=True) - - self.assertEqual("d79634e1-6063-4ec9-95ff-50acbf609ff5", all_views[0].id) - self.assertEqual(7, all_views[0].total_views) - self.assertIsNone(all_views[0].created_at) - self.assertIsNone(all_views[0].updated_at) - self.assertIsNone(all_views[0].sheet_type) - - self.assertEqual("fd252f73-593c-4c4e-8584-c032b8022adc", all_views[1].id) - self.assertEqual(13, all_views[1].total_views) - self.assertEqual("2002-05-30T09:00:00Z", format_datetime(all_views[1].created_at)) - self.assertEqual("2002-06-05T08:00:59Z", format_datetime(all_views[1].updated_at)) - self.assertEqual("story", all_views[1].sheet_type) - - def test_get_with_usage_and_filter(self) -> None: - with open(GET_XML_USAGE, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl + "?includeUsageStatistics=true&filter=name:in:[foo,bar]", text=response_xml) - options = TSC.RequestOptions() - options.filter.add( - TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.In, ["foo", "bar"]) - ) - all_views, pagination_item = self.server.views.get(req_options=options, usage=True) - - self.assertEqual("ENDANGERED SAFARI", all_views[0].name) - self.assertEqual(7, all_views[0].total_views) - self.assertEqual("Overview", all_views[1].name) - self.assertEqual(13, all_views[1].total_views) - - def test_get_before_signin(self) -> None: - self.server._auth_token = None - self.assertRaises(TSC.NotSignedInError, self.server.views.get) - - def test_populate_preview_image(self) -> None: - with open(POPULATE_PREVIEW_IMAGE, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get( - self.siteurl + "/workbooks/3cc6cd06-89ce-4fdc-b935-5294135d6d42/" - "views/d79634e1-6063-4ec9-95ff-50acbf609ff5/previewImage", - content=response, - ) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - single_view._workbook_id = "3cc6cd06-89ce-4fdc-b935-5294135d6d42" - self.server.views.populate_preview_image(single_view) - self.assertEqual(response, single_view.preview_image) - - def test_populate_preview_image_missing_id(self) -> None: +TEST_ASSET_DIR = Path(__file__).parent / "assets" + +ADD_TAGS_XML = TEST_ASSET_DIR / "view_add_tags.xml" +GET_XML = TEST_ASSET_DIR / "view_get.xml" +GET_XML_ALL_FIELDS = TEST_ASSET_DIR / "view_get_all_fields.xml" +GET_XML_ID = TEST_ASSET_DIR / "view_get_id.xml" +GET_XML_USAGE = TEST_ASSET_DIR / "view_get_usage.xml" +GET_XML_ID_USAGE = TEST_ASSET_DIR / "view_get_id_usage.xml" +POPULATE_PREVIEW_IMAGE = TEST_ASSET_DIR / "Sample View Image.png" +POPULATE_PDF = TEST_ASSET_DIR / "populate_pdf.pdf" +POPULATE_CSV = TEST_ASSET_DIR / "populate_csv.csv" +POPULATE_EXCEL = TEST_ASSET_DIR / "populate_excel.xlsx" +POPULATE_PERMISSIONS_XML = TEST_ASSET_DIR / "view_populate_permissions.xml" +UPDATE_PERMISSIONS = TEST_ASSET_DIR / "view_update_permissions.xml" +UPDATE_XML = TEST_ASSET_DIR / "workbook_update.xml" + + +@pytest.fixture(scope="function") +def server(): + """Fixture to create a TSC.Server instance for testing.""" + server = TSC.Server("http://test", False) + + # Fake signin + server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" + server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" + server.version = "3.2" + + return server + + +def test_get(server: TSC.Server) -> None: + response_xml = GET_XML.read_text() + with requests_mock.mock() as m: + m.get(server.views.baseurl, text=response_xml) + all_views, pagination_item = server.views.get() + + assert 2 == pagination_item.total_available + assert "d79634e1-6063-4ec9-95ff-50acbf609ff5" == all_views[0].id + assert "ENDANGERED SAFARI" == all_views[0].name + assert "SafariSample/sheets/ENDANGEREDSAFARI" == all_views[0].content_url + assert "3cc6cd06-89ce-4fdc-b935-5294135d6d42" == all_views[0].workbook_id + assert "5de011f8-5aa9-4d5b-b991-f462c8dd6bb7" == all_views[0].owner_id + assert "5241e88d-d384-4fd7-9c2f-648b5247efc5" == all_views[0].project_id + assert {"tag1", "tag2"} == all_views[0].tags + assert all_views[0].created_at is None + assert all_views[0].updated_at is None + assert all_views[0].sheet_type is None + + assert "fd252f73-593c-4c4e-8584-c032b8022adc" == all_views[1].id + assert "Overview" == all_views[1].name + assert "Superstore/sheets/Overview" == all_views[1].content_url + assert "6d13b0ca-043d-4d42-8c9d-3f3313ea3a00" == all_views[1].workbook_id + assert "5de011f8-5aa9-4d5b-b991-f462c8dd6bb7" == all_views[1].owner_id + assert "5b534f74-3226-11e8-b47a-cb2e00f738a3" == all_views[1].project_id + assert "2002-05-30T09:00:00Z" == format_datetime(all_views[1].created_at) + assert "2002-06-05T08:00:59Z" == format_datetime(all_views[1].updated_at) + assert "story" == all_views[1].sheet_type + + +def test_get_by_id(server: TSC.Server) -> None: + response_xml = GET_XML_ID.read_text() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5", text=response_xml) + view = server.views.get_by_id("d79634e1-6063-4ec9-95ff-50acbf609ff5") + + assert "d79634e1-6063-4ec9-95ff-50acbf609ff5" == view.id + assert "ENDANGERED SAFARI" == view.name + assert "SafariSample/sheets/ENDANGEREDSAFARI" == view.content_url + assert "3cc6cd06-89ce-4fdc-b935-5294135d6d42" == view.workbook_id + assert "5de011f8-5aa9-4d5b-b991-f462c8dd6bb7" == view.owner_id + assert "5241e88d-d384-4fd7-9c2f-648b5247efc5" == view.project_id + assert {"tag1", "tag2"} == view.tags + assert "2002-05-30T09:00:00Z" == format_datetime(view.created_at) + assert "2002-06-05T08:00:59Z" == format_datetime(view.updated_at) + assert "story" == view.sheet_type + + +def test_get_by_id_usage(server: TSC.Server) -> None: + response_xml = GET_XML_ID_USAGE.read_text() + with requests_mock.mock() as m: + m.get( + server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5?includeUsageStatistics=true", + text=response_xml, + ) + view = server.views.get_by_id("d79634e1-6063-4ec9-95ff-50acbf609ff5", usage=True) + + assert "d79634e1-6063-4ec9-95ff-50acbf609ff5" == view.id + assert "ENDANGERED SAFARI" == view.name + assert "SafariSample/sheets/ENDANGEREDSAFARI" == view.content_url + assert "3cc6cd06-89ce-4fdc-b935-5294135d6d42" == view.workbook_id + assert "5de011f8-5aa9-4d5b-b991-f462c8dd6bb7" == view.owner_id + assert "5241e88d-d384-4fd7-9c2f-648b5247efc5" == view.project_id + assert {"tag1", "tag2"} == view.tags + assert "2002-05-30T09:00:00Z" == format_datetime(view.created_at) + assert "2002-06-05T08:00:59Z" == format_datetime(view.updated_at) + assert "story" == view.sheet_type + assert 7 == view.total_views + + +def test_get_by_id_missing_id(server: TSC.Server) -> None: + with pytest.raises(TSC.MissingRequiredFieldError): + server.views.get_by_id(None) + + +def test_get_with_usage(server: TSC.Server) -> None: + response_xml = GET_XML_USAGE.read_text() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "?includeUsageStatistics=true", text=response_xml) + all_views, pagination_item = server.views.get(usage=True) + + assert "d79634e1-6063-4ec9-95ff-50acbf609ff5" == all_views[0].id + assert 7 == all_views[0].total_views + assert all_views[0].created_at is None + assert all_views[0].updated_at is None + assert all_views[0].sheet_type is None + + assert "fd252f73-593c-4c4e-8584-c032b8022adc" == all_views[1].id + assert 13 == all_views[1].total_views + assert "2002-05-30T09:00:00Z" == format_datetime(all_views[1].created_at) + assert "2002-06-05T08:00:59Z" == format_datetime(all_views[1].updated_at) + assert "story" == all_views[1].sheet_type + + +def test_get_with_usage_and_filter(server: TSC.Server) -> None: + response_xml = GET_XML_USAGE.read_text() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "?includeUsageStatistics=true&filter=name:in:[foo,bar]", text=response_xml) + options = TSC.RequestOptions() + options.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.In, ["foo", "bar"])) + all_views, pagination_item = server.views.get(req_options=options, usage=True) + + assert "ENDANGERED SAFARI" == all_views[0].name + assert 7 == all_views[0].total_views + assert "Overview" == all_views[1].name + assert 13 == all_views[1].total_views + + +def test_get_before_signin(server: TSC.Server) -> None: + server._auth_token = None + with pytest.raises(TSC.NotSignedInError): + server.views.get() + + +def test_populate_preview_image(server: TSC.Server) -> None: + response = POPULATE_PREVIEW_IMAGE.read_bytes() + with requests_mock.mock() as m: + m.get( + server.views.siteurl + "/workbooks/3cc6cd06-89ce-4fdc-b935-5294135d6d42/" + "views/d79634e1-6063-4ec9-95ff-50acbf609ff5/previewImage", + content=response, + ) single_view = TSC.ViewItem() single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - self.assertRaises(TSC.MissingRequiredFieldError, self.server.views.populate_preview_image, single_view) - - single_view._id = None single_view._workbook_id = "3cc6cd06-89ce-4fdc-b935-5294135d6d42" - self.assertRaises(TSC.MissingRequiredFieldError, self.server.views.populate_preview_image, single_view) - - def test_populate_image(self) -> None: - with open(POPULATE_PREVIEW_IMAGE, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image", content=response) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - self.server.views.populate_image(single_view) - self.assertEqual(response, single_view.image) - - def test_populate_image_unsupported(self) -> None: - self.server.version = "3.8" - with open(POPULATE_PREVIEW_IMAGE, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get( - self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?vizWidth=1920&vizHeight=1080", - content=response, - ) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - - req_option = TSC.ImageRequestOptions(viz_width=1920, viz_height=1080) - - with self.assertRaises(UnsupportedAttributeError): - self.server.views.populate_image(single_view, req_option) - - def test_populate_image_viz_dimensions(self) -> None: - self.server.version = "3.23" - self.baseurl = self.server.views.baseurl - with open(POPULATE_PREVIEW_IMAGE, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get( - self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?vizWidth=1920&vizHeight=1080", - content=response, - ) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - - req_option = TSC.ImageRequestOptions(viz_width=1920, viz_height=1080) - - self.server.views.populate_image(single_view, req_option) - self.assertEqual(response, single_view.image) - - history = m.request_history - - def test_populate_image_with_options(self) -> None: - with open(POPULATE_PREVIEW_IMAGE, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get( - self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?resolution=high&maxAge=10", content=response - ) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - req_option = TSC.ImageRequestOptions(imageresolution=TSC.ImageRequestOptions.Resolution.High, maxage=10) - self.server.views.populate_image(single_view, req_option) - self.assertEqual(response, single_view.image) - - def test_populate_pdf(self) -> None: - with open(POPULATE_PDF, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get( - self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?type=letter&orientation=portrait&maxAge=5", - content=response, - ) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - - size = TSC.PDFRequestOptions.PageType.Letter - orientation = TSC.PDFRequestOptions.Orientation.Portrait - req_option = TSC.PDFRequestOptions(size, orientation, 5) - - self.server.views.populate_pdf(single_view, req_option) - self.assertEqual(response, single_view.pdf) - - def test_populate_csv(self) -> None: - with open(POPULATE_CSV, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/data?maxAge=1", content=response) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - request_option = TSC.CSVRequestOptions(maxage=1) - self.server.views.populate_csv(single_view, request_option) - - csv_file = b"".join(single_view.csv) - self.assertEqual(response, csv_file) - - def test_populate_csv_default_maxage(self) -> None: - with open(POPULATE_CSV, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/data", content=response) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - self.server.views.populate_csv(single_view) - - csv_file = b"".join(single_view.csv) - self.assertEqual(response, csv_file) - - def test_populate_image_missing_id(self) -> None: + server.views.populate_preview_image(single_view) + assert response == single_view.preview_image + + +def test_populate_preview_image_missing_id(server: TSC.Server) -> None: + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + with pytest.raises(TSC.MissingRequiredFieldError): + server.views.populate_preview_image(single_view) + + single_view._id = None + single_view._workbook_id = "3cc6cd06-89ce-4fdc-b935-5294135d6d42" + with pytest.raises(TSC.MissingRequiredFieldError): + server.views.populate_preview_image(single_view) + + +def test_populate_image(server: TSC.Server) -> None: + response = POPULATE_PREVIEW_IMAGE.read_bytes() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image", content=response) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + server.views.populate_image(single_view) + assert response == single_view.image + + +def test_populate_image_unsupported(server: TSC.Server) -> None: + server.version = "3.8" + response = POPULATE_PREVIEW_IMAGE.read_bytes() + with requests_mock.mock() as m: + m.get( + server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?vizWidth=1920&vizHeight=1080", + content=response, + ) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + + req_option = TSC.ImageRequestOptions(viz_width=1920, viz_height=1080) + + with pytest.raises(UnsupportedAttributeError): + server.views.populate_image(single_view, req_option) + + +def test_populate_image_viz_dimensions(server: TSC.Server) -> None: + server.version = "3.23" + response = POPULATE_PREVIEW_IMAGE.read_bytes() + with requests_mock.mock() as m: + m.get( + server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?vizWidth=1920&vizHeight=1080", + content=response, + ) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + + req_option = TSC.ImageRequestOptions(viz_width=1920, viz_height=1080) + + server.views.populate_image(single_view, req_option) + assert response == single_view.image + + history = m.request_history + + +def test_populate_image_with_options(server: TSC.Server) -> None: + response = POPULATE_PREVIEW_IMAGE.read_bytes() + with requests_mock.mock() as m: + m.get( + server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?resolution=high&maxAge=10", + content=response, + ) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + req_option = TSC.ImageRequestOptions(imageresolution=TSC.ImageRequestOptions.Resolution.High, maxage=10) + server.views.populate_image(single_view, req_option) + assert response == single_view.image + + +def test_populate_pdf(server: TSC.Server) -> None: + response = POPULATE_PDF.read_bytes() + with requests_mock.mock() as m: + m.get( + server.views.baseurl + + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?type=letter&orientation=portrait&maxAge=5", + content=response, + ) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + + size = TSC.PDFRequestOptions.PageType.Letter + orientation = TSC.PDFRequestOptions.Orientation.Portrait + req_option = TSC.PDFRequestOptions(size, orientation, 5) + + server.views.populate_pdf(single_view, req_option) + assert response == single_view.pdf + + +def test_populate_csv(server: TSC.Server) -> None: + response = POPULATE_CSV.read_bytes() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/data?maxAge=1", content=response) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + request_option = TSC.CSVRequestOptions(maxage=1) + server.views.populate_csv(single_view, request_option) + + csv_file = b"".join(single_view.csv) + assert response == csv_file + + +def test_populate_csv_default_maxage(server: TSC.Server) -> None: + response = POPULATE_CSV.read_bytes() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/data", content=response) single_view = TSC.ViewItem() - single_view._id = None - self.assertRaises(TSC.MissingRequiredFieldError, self.server.views.populate_image, single_view) - - def test_populate_permissions(self) -> None: - with open(POPULATE_PERMISSIONS_XML, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl + "/e490bec4-2652-4fda-8c4e-f087db6fa328/permissions", text=response_xml) - single_view = TSC.ViewItem() - single_view._id = "e490bec4-2652-4fda-8c4e-f087db6fa328" - - self.server.views.populate_permissions(single_view) - permissions = single_view.permissions - - self.assertEqual(permissions[0].grantee.tag_name, "group") - self.assertEqual(permissions[0].grantee.id, "c8f2773a-c83a-11e8-8c8f-33e6d787b506") - self.assertDictEqual( - permissions[0].capabilities, - { - TSC.Permission.Capability.ViewComments: TSC.Permission.Mode.Allow, - TSC.Permission.Capability.Read: TSC.Permission.Mode.Allow, - TSC.Permission.Capability.AddComment: TSC.Permission.Mode.Allow, - TSC.Permission.Capability.ExportData: TSC.Permission.Mode.Allow, - TSC.Permission.Capability.ExportImage: TSC.Permission.Mode.Allow, - }, - ) - - def test_add_permissions(self) -> None: - with open(UPDATE_PERMISSIONS, "rb") as f: - response_xml = f.read().decode("utf-8") + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + server.views.populate_csv(single_view) + + csv_file = b"".join(single_view.csv) + assert response == csv_file + + +def test_populate_image_missing_id(server: TSC.Server) -> None: + single_view = TSC.ViewItem() + single_view._id = None + with pytest.raises(TSC.MissingRequiredFieldError): + server.views.populate_image(single_view) + +def test_populate_permissions(server: TSC.Server) -> None: + response_xml = POPULATE_PERMISSIONS_XML.read_text() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "/e490bec4-2652-4fda-8c4e-f087db6fa328/permissions", text=response_xml) single_view = TSC.ViewItem() - single_view._id = "21778de4-b7b9-44bc-a599-1506a2639ace" - - bob = UserItem.as_reference("7c37ee24-c4b1-42b6-a154-eaeab7ee330a") - group_of_people = GroupItem.as_reference("5e5e1978-71fa-11e4-87dd-7382f5c437af") - - new_permissions = [PermissionsRule(bob, {"Write": "Allow"}), PermissionsRule(group_of_people, {"Read": "Deny"})] - - with requests_mock.mock() as m: - m.put(self.baseurl + "/21778de4-b7b9-44bc-a599-1506a2639ace/permissions", text=response_xml) - permissions = self.server.views.update_permissions(single_view, new_permissions) - - self.assertEqual(permissions[0].grantee.tag_name, "group") - self.assertEqual(permissions[0].grantee.id, "5e5e1978-71fa-11e4-87dd-7382f5c437af") - self.assertDictEqual(permissions[0].capabilities, {TSC.Permission.Capability.Read: TSC.Permission.Mode.Deny}) - - self.assertEqual(permissions[1].grantee.tag_name, "user") - self.assertEqual(permissions[1].grantee.id, "7c37ee24-c4b1-42b6-a154-eaeab7ee330a") - self.assertDictEqual(permissions[1].capabilities, {TSC.Permission.Capability.Write: TSC.Permission.Mode.Allow}) - - def test_update_tags(self) -> None: - with open(ADD_TAGS_XML, "rb") as f: - add_tags_xml = f.read().decode("utf-8") - with open(UPDATE_XML, "rb") as f: - update_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.put(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/tags", text=add_tags_xml) - m.delete(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/tags/b", status_code=204) - m.delete(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/tags/d", status_code=204) - m.put(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5", text=update_xml) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - single_view._initial_tags.update(["a", "b", "c", "d"]) - single_view.tags.update(["a", "c", "e"]) - updated_view = self.server.views.update(single_view) - - self.assertEqual(single_view.tags, updated_view.tags) - self.assertEqual(single_view._initial_tags, updated_view._initial_tags) - - def test_populate_excel(self) -> None: - self.server.version = "3.8" - self.baseurl = self.server.views.baseurl - with open(POPULATE_EXCEL, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/crosstab/excel?maxAge=1", content=response) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - request_option = TSC.ExcelRequestOptions(maxage=1) - self.server.views.populate_excel(single_view, request_option) - - excel_file = b"".join(single_view.excel) - self.assertEqual(response, excel_file) - - def test_filter_excel(self) -> None: - self.server.version = "3.8" - self.baseurl = self.server.views.baseurl - with open(POPULATE_EXCEL, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get(self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/crosstab/excel?maxAge=1", content=response) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - request_option = TSC.ExcelRequestOptions(maxage=1) - request_option.vf("stuff", "1") - self.server.views.populate_excel(single_view, request_option) - - excel_file = b"".join(single_view.excel) - self.assertEqual(response, excel_file) - - def test_pdf_height(self) -> None: - self.server.version = "3.8" - self.baseurl = self.server.views.baseurl - with open(POPULATE_PDF, "rb") as f: - response = f.read() - with requests_mock.mock() as m: - m.get( - self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?vizHeight=1080&vizWidth=1920", - content=response, - ) - single_view = TSC.ViewItem() - single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" - - req_option = TSC.PDFRequestOptions( - viz_height=1080, - viz_width=1920, - ) - - self.server.views.populate_pdf(single_view, req_option) - self.assertEqual(response, single_view.pdf) - - def test_pdf_errors(self) -> None: - req_option = TSC.PDFRequestOptions(viz_height=1080) - with self.assertRaises(ValueError): - req_option.get_query_params() - req_option = TSC.PDFRequestOptions(viz_width=1920) - with self.assertRaises(ValueError): - req_option.get_query_params() - - def test_view_get_all_fields(self) -> None: - self.server.version = "3.21" - self.baseurl = self.server.views.baseurl - with open(GET_XML_ALL_FIELDS) as f: - response_xml = f.read() - - ro = TSC.RequestOptions() - ro.all_fields = True - - with requests_mock.mock() as m: - m.get(f"{self.baseurl}?fields=_all_", text=response_xml) - views, _ = self.server.views.get(req_options=ro) - - assert views[0].id == "2bdcd787-dcc6-4a5d-bc61-2846f1ef4534" - assert views[0].name == "Overview" - assert views[0].content_url == "Superstore/sheets/Overview" - assert views[0].created_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[0].updated_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[0].sheet_type == "dashboard" - assert views[0].favorites_total == 0 - assert views[0].view_url_name == "Overview" - assert isinstance(views[0].workbook, TSC.WorkbookItem) - assert views[0].workbook.id == "9df3e2d1-070e-497a-9578-8cc557ced9df" - assert views[0].workbook.name == "Superstore" - assert views[0].workbook.content_url == "Superstore" - assert views[0].workbook.show_tabs - assert views[0].workbook.size == 2 - assert views[0].workbook.created_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[0].workbook.updated_at == parse_datetime("2024-02-14T04:42:10Z") - assert views[0].workbook.sheet_count == 9 - assert not views[0].workbook.has_extracts - assert isinstance(views[0].owner, TSC.UserItem) - assert views[0].owner.email == "bob@example.com" - assert views[0].owner.fullname == "Bob" - assert views[0].owner.id == "ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9" - assert views[0].owner.last_login == parse_datetime("2025-02-04T06:39:20Z") - assert views[0].owner.name == "bob@example.com" - assert views[0].owner.site_role == "SiteAdministratorCreator" - assert isinstance(views[0].project, TSC.ProjectItem) - assert views[0].project.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" - assert views[0].project.name == "Samples" - assert views[0].project.description == "This project includes automatically uploaded samples." - assert views[0].total_views == 0 - assert isinstance(views[0].location, TSC.LocationItem) - assert views[0].location.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" - assert views[0].location.type == "Project" - assert views[1].id == "2a3fd19d-9129-413d-9ff7-9dfc36bf7f7e" - assert views[1].name == "Product" - assert views[1].content_url == "Superstore/sheets/Product" - assert views[1].created_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[1].updated_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[1].sheet_type == "dashboard" - assert views[1].favorites_total == 0 - assert views[1].view_url_name == "Product" - assert isinstance(views[1].workbook, TSC.WorkbookItem) - assert views[1].workbook.id == "9df3e2d1-070e-497a-9578-8cc557ced9df" - assert views[1].workbook.name == "Superstore" - assert views[1].workbook.content_url == "Superstore" - assert views[1].workbook.show_tabs - assert views[1].workbook.size == 2 - assert views[1].workbook.created_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[1].workbook.updated_at == parse_datetime("2024-02-14T04:42:10Z") - assert views[1].workbook.sheet_count == 9 - assert not views[1].workbook.has_extracts - assert isinstance(views[1].owner, TSC.UserItem) - assert views[1].owner.email == "bob@example.com" - assert views[1].owner.fullname == "Bob" - assert views[1].owner.id == "ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9" - assert views[1].owner.last_login == parse_datetime("2025-02-04T06:39:20Z") - assert views[1].owner.name == "bob@example.com" - assert views[1].owner.site_role == "SiteAdministratorCreator" - assert isinstance(views[1].project, TSC.ProjectItem) - assert views[1].project.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" - assert views[1].project.name == "Samples" - assert views[1].project.description == "This project includes automatically uploaded samples." - assert views[1].total_views == 0 - assert isinstance(views[1].location, TSC.LocationItem) - assert views[1].location.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" - assert views[1].location.type == "Project" - assert views[2].id == "459eda9a-85e4-46bf-a2f2-62936bd2e99a" - assert views[2].name == "Customers" - assert views[2].content_url == "Superstore/sheets/Customers" - assert views[2].created_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[2].updated_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[2].sheet_type == "dashboard" - assert views[2].favorites_total == 0 - assert views[2].view_url_name == "Customers" - assert isinstance(views[2].workbook, TSC.WorkbookItem) - assert views[2].workbook.id == "9df3e2d1-070e-497a-9578-8cc557ced9df" - assert views[2].workbook.name == "Superstore" - assert views[2].workbook.content_url == "Superstore" - assert views[2].workbook.show_tabs - assert views[2].workbook.size == 2 - assert views[2].workbook.created_at == parse_datetime("2024-02-14T04:42:09Z") - assert views[2].workbook.updated_at == parse_datetime("2024-02-14T04:42:10Z") - assert views[2].workbook.sheet_count == 9 - assert not views[2].workbook.has_extracts - assert isinstance(views[2].owner, TSC.UserItem) - assert views[2].owner.email == "bob@example.com" - assert views[2].owner.fullname == "Bob" - assert views[2].owner.id == "ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9" - assert views[2].owner.last_login == parse_datetime("2025-02-04T06:39:20Z") - assert views[2].owner.name == "bob@example.com" - assert views[2].owner.site_role == "SiteAdministratorCreator" - assert isinstance(views[2].project, TSC.ProjectItem) - assert views[2].project.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" - assert views[2].project.name == "Samples" - assert views[2].project.description == "This project includes automatically uploaded samples." - assert views[2].total_views == 0 - assert isinstance(views[2].location, TSC.LocationItem) - assert views[2].location.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" - assert views[2].location.type == "Project" + single_view._id = "e490bec4-2652-4fda-8c4e-f087db6fa328" + + server.views.populate_permissions(single_view) + permissions = single_view.permissions + + assert permissions[0].grantee.tag_name == "group" + assert permissions[0].grantee.id == "c8f2773a-c83a-11e8-8c8f-33e6d787b506" + assert permissions[0].capabilities == { + TSC.Permission.Capability.ViewComments: TSC.Permission.Mode.Allow, + TSC.Permission.Capability.Read: TSC.Permission.Mode.Allow, + TSC.Permission.Capability.AddComment: TSC.Permission.Mode.Allow, + TSC.Permission.Capability.ExportData: TSC.Permission.Mode.Allow, + TSC.Permission.Capability.ExportImage: TSC.Permission.Mode.Allow, + } + + +def test_add_permissions(server: TSC.Server) -> None: + response_xml = UPDATE_PERMISSIONS.read_text() + + single_view = TSC.ViewItem() + single_view._id = "21778de4-b7b9-44bc-a599-1506a2639ace" + + bob = UserItem.as_reference("7c37ee24-c4b1-42b6-a154-eaeab7ee330a") + group_of_people = GroupItem.as_reference("5e5e1978-71fa-11e4-87dd-7382f5c437af") + + new_permissions = [PermissionsRule(bob, {"Write": "Allow"}), PermissionsRule(group_of_people, {"Read": "Deny"})] + + with requests_mock.mock() as m: + m.put(server.views.baseurl + "/21778de4-b7b9-44bc-a599-1506a2639ace/permissions", text=response_xml) + permissions = server.views.update_permissions(single_view, new_permissions) + + assert permissions[0].grantee.tag_name == "group" + assert permissions[0].grantee.id == "5e5e1978-71fa-11e4-87dd-7382f5c437af" + assert permissions[0].capabilities == {TSC.Permission.Capability.Read: TSC.Permission.Mode.Deny} + + assert permissions[1].grantee.tag_name == "user" + assert permissions[1].grantee.id == "7c37ee24-c4b1-42b6-a154-eaeab7ee330a" + assert permissions[1].capabilities == {TSC.Permission.Capability.Write: TSC.Permission.Mode.Allow} + + +def test_update_tags(server: TSC.Server) -> None: + add_tags_xml = ADD_TAGS_XML.read_text() + update_xml = UPDATE_XML.read_text() + with requests_mock.mock() as m: + m.put(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/tags", text=add_tags_xml) + m.delete(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/tags/b", status_code=204) + m.delete(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/tags/d", status_code=204) + m.put(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5", text=update_xml) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + single_view._initial_tags.update(["a", "b", "c", "d"]) + single_view.tags.update(["a", "c", "e"]) + updated_view = server.views.update(single_view) + + assert single_view.tags == updated_view.tags + assert single_view._initial_tags == updated_view._initial_tags + + +def test_populate_excel(server: TSC.Server) -> None: + server.version = "3.8" + response = POPULATE_EXCEL.read_bytes() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/crosstab/excel?maxAge=1", content=response) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + request_option = TSC.ExcelRequestOptions(maxage=1) + server.views.populate_excel(single_view, request_option) + + excel_file = b"".join(single_view.excel) + assert response == excel_file + + +def test_filter_excel(server: TSC.Server) -> None: + server.version = "3.8" + response = POPULATE_EXCEL.read_bytes() + with requests_mock.mock() as m: + m.get(server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/crosstab/excel?maxAge=1", content=response) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + request_option = TSC.ExcelRequestOptions(maxage=1) + request_option.vf("stuff", "1") + server.views.populate_excel(single_view, request_option) + + excel_file = b"".join(single_view.excel) + assert response == excel_file + + +def test_pdf_height(server: TSC.Server) -> None: + server.version = "3.8" + response = POPULATE_PDF.read_bytes() + with requests_mock.mock() as m: + m.get( + server.views.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?vizHeight=1080&vizWidth=1920", + content=response, + ) + single_view = TSC.ViewItem() + single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5" + + req_option = TSC.PDFRequestOptions( + viz_height=1080, + viz_width=1920, + ) + + server.views.populate_pdf(single_view, req_option) + assert response == single_view.pdf + + +def test_pdf_errors(server: TSC.Server) -> None: + req_option = TSC.PDFRequestOptions(viz_height=1080) + with pytest.raises(ValueError): + req_option.get_query_params() + req_option = TSC.PDFRequestOptions(viz_width=1920) + with pytest.raises(ValueError): + req_option.get_query_params() + + +def test_view_get_all_fields(server: TSC.Server) -> None: + server.version = "3.21" + response_xml = GET_XML_ALL_FIELDS.read_text() + + ro = TSC.RequestOptions() + ro.all_fields = True + + with requests_mock.mock() as m: + m.get(f"{server.views.baseurl}?fields=_all_", text=response_xml) + views, _ = server.views.get(req_options=ro) + + assert views[0].id == "2bdcd787-dcc6-4a5d-bc61-2846f1ef4534" + assert views[0].name == "Overview" + assert views[0].content_url == "Superstore/sheets/Overview" + assert views[0].created_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[0].updated_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[0].sheet_type == "dashboard" + assert views[0].favorites_total == 0 + assert views[0].view_url_name == "Overview" + assert isinstance(views[0].workbook, TSC.WorkbookItem) + assert views[0].workbook.id == "9df3e2d1-070e-497a-9578-8cc557ced9df" + assert views[0].workbook.name == "Superstore" + assert views[0].workbook.content_url == "Superstore" + assert views[0].workbook.show_tabs + assert views[0].workbook.size == 2 + assert views[0].workbook.created_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[0].workbook.updated_at == parse_datetime("2024-02-14T04:42:10Z") + assert views[0].workbook.sheet_count == 9 + assert not views[0].workbook.has_extracts + assert isinstance(views[0].owner, TSC.UserItem) + assert views[0].owner.email == "bob@example.com" + assert views[0].owner.fullname == "Bob" + assert views[0].owner.id == "ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9" + assert views[0].owner.last_login == parse_datetime("2025-02-04T06:39:20Z") + assert views[0].owner.name == "bob@example.com" + assert views[0].owner.site_role == "SiteAdministratorCreator" + assert isinstance(views[0].project, TSC.ProjectItem) + assert views[0].project.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" + assert views[0].project.name == "Samples" + assert views[0].project.description == "This project includes automatically uploaded samples." + assert views[0].total_views == 0 + assert isinstance(views[0].location, TSC.LocationItem) + assert views[0].location.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" + assert views[0].location.type == "Project" + assert views[1].id == "2a3fd19d-9129-413d-9ff7-9dfc36bf7f7e" + assert views[1].name == "Product" + assert views[1].content_url == "Superstore/sheets/Product" + assert views[1].created_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[1].updated_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[1].sheet_type == "dashboard" + assert views[1].favorites_total == 0 + assert views[1].view_url_name == "Product" + assert isinstance(views[1].workbook, TSC.WorkbookItem) + assert views[1].workbook.id == "9df3e2d1-070e-497a-9578-8cc557ced9df" + assert views[1].workbook.name == "Superstore" + assert views[1].workbook.content_url == "Superstore" + assert views[1].workbook.show_tabs + assert views[1].workbook.size == 2 + assert views[1].workbook.created_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[1].workbook.updated_at == parse_datetime("2024-02-14T04:42:10Z") + assert views[1].workbook.sheet_count == 9 + assert not views[1].workbook.has_extracts + assert isinstance(views[1].owner, TSC.UserItem) + assert views[1].owner.email == "bob@example.com" + assert views[1].owner.fullname == "Bob" + assert views[1].owner.id == "ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9" + assert views[1].owner.last_login == parse_datetime("2025-02-04T06:39:20Z") + assert views[1].owner.name == "bob@example.com" + assert views[1].owner.site_role == "SiteAdministratorCreator" + assert isinstance(views[1].project, TSC.ProjectItem) + assert views[1].project.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" + assert views[1].project.name == "Samples" + assert views[1].project.description == "This project includes automatically uploaded samples." + assert views[1].total_views == 0 + assert isinstance(views[1].location, TSC.LocationItem) + assert views[1].location.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" + assert views[1].location.type == "Project" + assert views[2].id == "459eda9a-85e4-46bf-a2f2-62936bd2e99a" + assert views[2].name == "Customers" + assert views[2].content_url == "Superstore/sheets/Customers" + assert views[2].created_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[2].updated_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[2].sheet_type == "dashboard" + assert views[2].favorites_total == 0 + assert views[2].view_url_name == "Customers" + assert isinstance(views[2].workbook, TSC.WorkbookItem) + assert views[2].workbook.id == "9df3e2d1-070e-497a-9578-8cc557ced9df" + assert views[2].workbook.name == "Superstore" + assert views[2].workbook.content_url == "Superstore" + assert views[2].workbook.show_tabs + assert views[2].workbook.size == 2 + assert views[2].workbook.created_at == parse_datetime("2024-02-14T04:42:09Z") + assert views[2].workbook.updated_at == parse_datetime("2024-02-14T04:42:10Z") + assert views[2].workbook.sheet_count == 9 + assert not views[2].workbook.has_extracts + assert isinstance(views[2].owner, TSC.UserItem) + assert views[2].owner.email == "bob@example.com" + assert views[2].owner.fullname == "Bob" + assert views[2].owner.id == "ee8bc9ca-77fe-4ae0-8093-cf77f0ee67a9" + assert views[2].owner.last_login == parse_datetime("2025-02-04T06:39:20Z") + assert views[2].owner.name == "bob@example.com" + assert views[2].owner.site_role == "SiteAdministratorCreator" + assert isinstance(views[2].project, TSC.ProjectItem) + assert views[2].project.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" + assert views[2].project.name == "Samples" + assert views[2].project.description == "This project includes automatically uploaded samples." + assert views[2].total_views == 0 + assert isinstance(views[2].location, TSC.LocationItem) + assert views[2].location.id == "669ca36b-492e-4ccf-bca1-3614fe6a9d7a" + assert views[2].location.type == "Project" diff --git a/test/test_view_acceleration.py b/test/test_view_acceleration.py index 766831b0..cbd1dc19 100644 --- a/test/test_view_acceleration.py +++ b/test/test_view_acceleration.py @@ -1,119 +1,120 @@ -import os +from pathlib import Path import requests_mock -import unittest + +import pytest import tableauserverclient as TSC from tableauserverclient.datetime_helpers import format_datetime -TEST_ASSET_DIR = os.path.join(os.path.dirname(__file__), "assets") - -GET_BY_ID_ACCELERATION_STATUS_XML = os.path.join(TEST_ASSET_DIR, "workbook_get_by_id_acceleration_status.xml") -POPULATE_VIEWS_XML = os.path.join(TEST_ASSET_DIR, "workbook_populate_views.xml") -UPDATE_VIEWS_ACCELERATION_STATUS_XML = os.path.join(TEST_ASSET_DIR, "workbook_update_views_acceleration_status.xml") -UPDATE_WORKBOOK_ACCELERATION_STATUS_XML = os.path.join(TEST_ASSET_DIR, "workbook_update_acceleration_status.xml") - - -class WorkbookTests(unittest.TestCase): - def setUp(self) -> None: - self.server = TSC.Server("http://test", False) - - # Fake sign in - self.server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" - self.server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" - - self.baseurl = self.server.workbooks.baseurl - - def test_get_by_id(self) -> None: - with open(GET_BY_ID_ACCELERATION_STATUS_XML, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl + "/3cc6cd06-89ce-4fdc-b935-5294135d6d42", text=response_xml) - single_workbook = self.server.workbooks.get_by_id("3cc6cd06-89ce-4fdc-b935-5294135d6d42") - - self.assertEqual("3cc6cd06-89ce-4fdc-b935-5294135d6d42", single_workbook.id) - self.assertEqual("SafariSample", single_workbook.name) - self.assertEqual("SafariSample", single_workbook.content_url) - self.assertEqual("http://tableauserver/#/workbooks/2/views", single_workbook.webpage_url) - self.assertEqual(False, single_workbook.show_tabs) - self.assertEqual(26, single_workbook.size) - self.assertEqual("2016-07-26T20:34:56Z", format_datetime(single_workbook.created_at)) - self.assertEqual("description for SafariSample", single_workbook.description) - self.assertEqual("2016-07-26T20:35:05Z", format_datetime(single_workbook.updated_at)) - self.assertEqual("ee8c6e70-43b6-11e6-af4f-f7b0d8e20760", single_workbook.project_id) - self.assertEqual("default", single_workbook.project_name) - self.assertEqual("5de011f8-5aa9-4d5b-b991-f462c8dd6bb7", single_workbook.owner_id) - self.assertEqual({"Safari", "Sample"}, single_workbook.tags) - self.assertEqual("d79634e1-6063-4ec9-95ff-50acbf609ff5", single_workbook.views[0].id) - self.assertEqual("ENDANGERED SAFARI", single_workbook.views[0].name) - self.assertEqual("SafariSample/sheets/ENDANGEREDSAFARI", single_workbook.views[0].content_url) - self.assertEqual(True, single_workbook.views[0].data_acceleration_config["acceleration_enabled"]) - self.assertEqual("Enabled", single_workbook.views[0].data_acceleration_config["acceleration_status"]) - self.assertEqual("d79634e1-6063-4ec9-95ff-50acbf609ff9", single_workbook.views[1].id) - self.assertEqual("ENDANGERED SAFARI 2", single_workbook.views[1].name) - self.assertEqual("SafariSample/sheets/ENDANGEREDSAFARI2", single_workbook.views[1].content_url) - self.assertEqual(False, single_workbook.views[1].data_acceleration_config["acceleration_enabled"]) - self.assertEqual("Suspended", single_workbook.views[1].data_acceleration_config["acceleration_status"]) - - def test_update_workbook_acceleration(self) -> None: - with open(UPDATE_WORKBOOK_ACCELERATION_STATUS_XML, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.put(self.baseurl + "/1f951daf-4061-451a-9df1-69a8062664f2", text=response_xml) - single_workbook = TSC.WorkbookItem("1d0304cd-3796-429f-b815-7258370b9b74", show_tabs=True) - single_workbook._id = "1f951daf-4061-451a-9df1-69a8062664f2" - single_workbook.data_acceleration_config = { - "acceleration_enabled": True, - "accelerate_now": False, - "last_updated_at": None, - "acceleration_status": None, - } - # update with parameter includeViewAccelerationStatus=True - single_workbook = self.server.workbooks.update(single_workbook, True) - - self.assertEqual("1f951daf-4061-451a-9df1-69a8062664f2", single_workbook.id) - self.assertEqual("1d0304cd-3796-429f-b815-7258370b9b74", single_workbook.project_id) - self.assertEqual("SafariSample/sheets/ENDANGEREDSAFARI", single_workbook.views[0].content_url) - self.assertEqual(True, single_workbook.views[0].data_acceleration_config["acceleration_enabled"]) - self.assertEqual("Pending", single_workbook.views[0].data_acceleration_config["acceleration_status"]) - self.assertEqual("d79634e1-6063-4ec9-95ff-50acbf609ff9", single_workbook.views[1].id) - self.assertEqual("ENDANGERED SAFARI 2", single_workbook.views[1].name) - self.assertEqual("SafariSample/sheets/ENDANGEREDSAFARI2", single_workbook.views[1].content_url) - self.assertEqual(True, single_workbook.views[1].data_acceleration_config["acceleration_enabled"]) - self.assertEqual("Pending", single_workbook.views[1].data_acceleration_config["acceleration_status"]) - - def test_update_views_acceleration(self) -> None: - with open(POPULATE_VIEWS_XML, "rb") as f: - views_xml = f.read().decode("utf-8") - with open(UPDATE_VIEWS_ACCELERATION_STATUS_XML, "rb") as f: - response_xml = f.read().decode("utf-8") - with requests_mock.mock() as m: - m.get(self.baseurl + "/1f951daf-4061-451a-9df1-69a8062664f2/views", text=views_xml) - m.put(self.baseurl + "/1f951daf-4061-451a-9df1-69a8062664f2", text=response_xml) - single_workbook = TSC.WorkbookItem("1d0304cd-3796-429f-b815-7258370b9b74", show_tabs=True) - single_workbook._id = "1f951daf-4061-451a-9df1-69a8062664f2" - single_workbook.data_acceleration_config = { - "acceleration_enabled": False, - "accelerate_now": False, - "last_updated_at": None, - "acceleration_status": None, - } - self.server.workbooks.populate_views(single_workbook) - single_workbook.views = [single_workbook.views[1], single_workbook.views[2]] - # update with parameter includeViewAccelerationStatus=True - single_workbook = self.server.workbooks.update(single_workbook, True) - - views_list = single_workbook.views - self.assertEqual("097dbe13-de89-445f-b2c3-02f28bd010c1", views_list[0].id) - self.assertEqual("GDP per capita", views_list[0].name) - self.assertEqual(False, views_list[0].data_acceleration_config["acceleration_enabled"]) - self.assertEqual("Disabled", views_list[0].data_acceleration_config["acceleration_status"]) - - self.assertEqual("2c1ab9d7-8d64-4cc6-b495-52e40c60c330", views_list[1].id) - self.assertEqual("Country ranks", views_list[1].name) - self.assertEqual(True, views_list[1].data_acceleration_config["acceleration_enabled"]) - self.assertEqual("Pending", views_list[1].data_acceleration_config["acceleration_status"]) - - self.assertEqual("0599c28c-6d82-457e-a453-e52c1bdb00f5", views_list[2].id) - self.assertEqual("Interest rates", views_list[2].name) - self.assertEqual(True, views_list[2].data_acceleration_config["acceleration_enabled"]) - self.assertEqual("Pending", views_list[2].data_acceleration_config["acceleration_status"]) +TEST_ASSET_DIR = Path(__file__).parent / "assets" + +GET_BY_ID_ACCELERATION_STATUS_XML = TEST_ASSET_DIR / "workbook_get_by_id_acceleration_status.xml" +POPULATE_VIEWS_XML = TEST_ASSET_DIR / "workbook_populate_views.xml" +UPDATE_VIEWS_ACCELERATION_STATUS_XML = TEST_ASSET_DIR / "workbook_update_views_acceleration_status.xml" +UPDATE_WORKBOOK_ACCELERATION_STATUS_XML = TEST_ASSET_DIR / "workbook_update_acceleration_status.xml" + + +@pytest.fixture(scope="function") +def server(): + """Fixture to create a TSC.Server instance for testing.""" + server = TSC.Server("http://test", False) + + # Fake signin + server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" + server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" + + return server + + +def test_get_by_id(server: TSC.Server) -> None: + response_xml = GET_BY_ID_ACCELERATION_STATUS_XML.read_text() + with requests_mock.mock() as m: + m.get(server.workbooks.baseurl + "/3cc6cd06-89ce-4fdc-b935-5294135d6d42", text=response_xml) + single_workbook = server.workbooks.get_by_id("3cc6cd06-89ce-4fdc-b935-5294135d6d42") + + assert "3cc6cd06-89ce-4fdc-b935-5294135d6d42" == single_workbook.id + assert "SafariSample" == single_workbook.name + assert "SafariSample" == single_workbook.content_url + assert "http://tableauserver/#/workbooks/2/views" == single_workbook.webpage_url + assert single_workbook.show_tabs is False + assert 26 == single_workbook.size + assert "2016-07-26T20:34:56Z" == format_datetime(single_workbook.created_at) + assert "description for SafariSample" == single_workbook.description + assert "2016-07-26T20:35:05Z" == format_datetime(single_workbook.updated_at) + assert "ee8c6e70-43b6-11e6-af4f-f7b0d8e20760" == single_workbook.project_id + assert "default" == single_workbook.project_name + assert "5de011f8-5aa9-4d5b-b991-f462c8dd6bb7" == single_workbook.owner_id + assert {"Safari", "Sample"} == single_workbook.tags + assert "d79634e1-6063-4ec9-95ff-50acbf609ff5" == single_workbook.views[0].id + assert "ENDANGERED SAFARI" == single_workbook.views[0].name + assert "SafariSample/sheets/ENDANGEREDSAFARI" == single_workbook.views[0].content_url + assert single_workbook.views[0].data_acceleration_config["acceleration_enabled"] + assert "Enabled" == single_workbook.views[0].data_acceleration_config["acceleration_status"] + assert "d79634e1-6063-4ec9-95ff-50acbf609ff9" == single_workbook.views[1].id + assert "ENDANGERED SAFARI 2" == single_workbook.views[1].name + assert "SafariSample/sheets/ENDANGEREDSAFARI2" == single_workbook.views[1].content_url + assert single_workbook.views[1].data_acceleration_config["acceleration_enabled"] is False + assert "Suspended" == single_workbook.views[1].data_acceleration_config["acceleration_status"] + + +def test_update_workbook_acceleration(server: TSC.Server) -> None: + response_xml = UPDATE_WORKBOOK_ACCELERATION_STATUS_XML.read_text() + with requests_mock.mock() as m: + m.put(server.workbooks.baseurl + "/1f951daf-4061-451a-9df1-69a8062664f2", text=response_xml) + single_workbook = TSC.WorkbookItem("1d0304cd-3796-429f-b815-7258370b9b74", show_tabs=True) + single_workbook._id = "1f951daf-4061-451a-9df1-69a8062664f2" + single_workbook.data_acceleration_config = { + "acceleration_enabled": True, + "accelerate_now": False, + "last_updated_at": None, + "acceleration_status": None, + } + # update with parameter includeViewAccelerationStatus=True + single_workbook = server.workbooks.update(single_workbook, True) + + assert "1f951daf-4061-451a-9df1-69a8062664f2" == single_workbook.id + assert "1d0304cd-3796-429f-b815-7258370b9b74" == single_workbook.project_id + assert "SafariSample/sheets/ENDANGEREDSAFARI" == single_workbook.views[0].content_url + assert single_workbook.views[0].data_acceleration_config["acceleration_enabled"] + assert "Pending" == single_workbook.views[0].data_acceleration_config["acceleration_status"] + assert "d79634e1-6063-4ec9-95ff-50acbf609ff9" == single_workbook.views[1].id + assert "ENDANGERED SAFARI 2" == single_workbook.views[1].name + assert "SafariSample/sheets/ENDANGEREDSAFARI2" == single_workbook.views[1].content_url + assert single_workbook.views[1].data_acceleration_config["acceleration_enabled"] + assert "Pending" == single_workbook.views[1].data_acceleration_config["acceleration_status"] + + +def test_update_views_acceleration(server: TSC.Server) -> None: + views_xml = POPULATE_VIEWS_XML.read_text() + response_xml = UPDATE_VIEWS_ACCELERATION_STATUS_XML.read_text() + with requests_mock.mock() as m: + m.get(server.workbooks.baseurl + "/1f951daf-4061-451a-9df1-69a8062664f2/views", text=views_xml) + m.put(server.workbooks.baseurl + "/1f951daf-4061-451a-9df1-69a8062664f2", text=response_xml) + single_workbook = TSC.WorkbookItem("1d0304cd-3796-429f-b815-7258370b9b74", show_tabs=True) + single_workbook._id = "1f951daf-4061-451a-9df1-69a8062664f2" + single_workbook.data_acceleration_config = { + "acceleration_enabled": False, + "accelerate_now": False, + "last_updated_at": None, + "acceleration_status": None, + } + server.workbooks.populate_views(single_workbook) + single_workbook.views = [single_workbook.views[1], single_workbook.views[2]] + # update with parameter includeViewAccelerationStatus=True + single_workbook = server.workbooks.update(single_workbook, True) + + views_list = single_workbook.views + assert "097dbe13-de89-445f-b2c3-02f28bd010c1" == views_list[0].id + assert "GDP per capita" == views_list[0].name + assert views_list[0].data_acceleration_config["acceleration_enabled"] is False + assert "Disabled" == views_list[0].data_acceleration_config["acceleration_status"] + + assert "2c1ab9d7-8d64-4cc6-b495-52e40c60c330" == views_list[1].id + assert "Country ranks" == views_list[1].name + assert views_list[1].data_acceleration_config["acceleration_enabled"] + assert "Pending" == views_list[1].data_acceleration_config["acceleration_status"] + + assert "0599c28c-6d82-457e-a453-e52c1bdb00f5" == views_list[2].id + assert "Interest rates" == views_list[2].name + assert views_list[2].data_acceleration_config["acceleration_enabled"] + assert "Pending" == views_list[2].data_acceleration_config["acceleration_status"]