You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2023/08/09 01:38:36 UTC

[superset] 01/01: Add tests

This is an automated email from the ASF dual-hosted git repository.

beto pushed a commit to branch upload_gsheets
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 3ec803d14f795d2277c21e04a56de4f480c2519b
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Tue Aug 8 17:09:51 2023 -0700

    Add tests
---
 superset/db_engine_specs/gsheets.py              |  2 +-
 tests/unit_tests/db_engine_specs/test_gsheets.py | 92 ++++++++++++++++++++++++
 2 files changed, 93 insertions(+), 1 deletion(-)

diff --git a/superset/db_engine_specs/gsheets.py b/superset/db_engine_specs/gsheets.py
index 729a90787a..226dceec6e 100644
--- a/superset/db_engine_specs/gsheets.py
+++ b/superset/db_engine_specs/gsheets.py
@@ -412,7 +412,7 @@ class GSheetsEngineSpec(ShillelaghEngineSpec):
         }
         url = (
             "https://sheets.googleapis.com/v4/spreadsheets/"
-            f"{spreadsheet_id}/values/{range_}:append"
+            f"{spreadsheet_id}/values/'{range_}':append"
         )
         cls._do_post(
             session,
diff --git a/tests/unit_tests/db_engine_specs/test_gsheets.py b/tests/unit_tests/db_engine_specs/test_gsheets.py
index 042e486642..40c515ede8 100644
--- a/tests/unit_tests/db_engine_specs/test_gsheets.py
+++ b/tests/unit_tests/db_engine_specs/test_gsheets.py
@@ -19,9 +19,13 @@
 
 import json
 
+import pandas as pd
+import pytest
 from pytest_mock import MockFixture
 
 from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
+from superset.exceptions import SupersetException
+from superset.sql_parse import Table
 
 
 class ProgrammingError(Exception):
@@ -307,3 +311,91 @@ def test_unmask_encrypted_extra_when_new_is_none() -> None:
     new = None
 
     assert GSheetsEngineSpec.unmask_encrypted_extra(old, new) is None
+
+
+def test_upload_new(mocker: MockFixture) -> None:
+    """
+    Test file upload when the table does not exist.
+    """
+    from superset.db_engine_specs.gsheets import GSheetsEngineSpec
+
+    mocker.patch("superset.db_engine_specs.gsheets.db")
+    get_adapter_for_table_name = mocker.patch(
+        "superset.db_engine_specs.gsheets.get_adapter_for_table_name"
+    )
+    session = get_adapter_for_table_name()._get_session()
+    session.post().json.return_value = {
+        "spreadsheetId": 1,
+        "spreadsheetUrl": "https://docs.example.org",
+        "sheets": [{"properties": {"title": "sample_data"}}],
+    }
+
+    database = mocker.MagicMock()
+    database.get_extra.return_value = {}
+
+    df = pd.DataFrame([1, "foo", 3.0])
+    table = Table("sample_data")
+
+    GSheetsEngineSpec.df_to_sql(database, table, df, {})
+    assert database.extra == json.dumps(
+        {"engine_params": {"catalog": {"sample_data": "https://docs.example.org"}}}
+    )
+
+
+def test_upload_existing(mocker: MockFixture) -> None:
+    """
+    Test file upload when the table does exist.
+    """
+    from superset.db_engine_specs.gsheets import GSheetsEngineSpec
+
+    mocker.patch("superset.db_engine_specs.gsheets.db")
+    get_adapter_for_table_name = mocker.patch(
+        "superset.db_engine_specs.gsheets.get_adapter_for_table_name"
+    )
+    adapter = get_adapter_for_table_name()
+    adapter._spreadsheet_id = 1
+    adapter._sheet_name = "sheet0"
+    session = adapter._get_session()
+    session.post().json.return_value = {
+        "spreadsheetId": 1,
+        "spreadsheetUrl": "https://docs.example.org",
+        "sheets": [{"properties": {"title": "sample_data"}}],
+    }
+
+    database = mocker.MagicMock()
+    database.get_extra.return_value = {
+        "engine_params": {"catalog": {"sample_data": "https://docs.example.org"}}
+    }
+
+    df = pd.DataFrame([1, "foo", 3.0])
+    table = Table("sample_data")
+
+    with pytest.raises(SupersetException) as excinfo:
+        GSheetsEngineSpec.df_to_sql(database, table, df, {"if_exists": "append"})
+    assert str(excinfo.value) == "Append operation not currently supported"
+
+    with pytest.raises(SupersetException) as excinfo:
+        GSheetsEngineSpec.df_to_sql(database, table, df, {"if_exists": "fail"})
+    assert str(excinfo.value) == "Table already exists"
+
+    GSheetsEngineSpec.df_to_sql(database, table, df, {"if_exists": "replace"})
+    session.post.assert_has_calls(
+        [
+            mocker.call(),
+            mocker.call(
+                "https://sheets.googleapis.com/v4/spreadsheets/1/values/'sheet0':clear",
+                json={},
+            ),
+            mocker.call().json(),
+            mocker.call(
+                "https://sheets.googleapis.com/v4/spreadsheets/1/values/'sheet0':append",
+                json={
+                    "range": "sheet0",
+                    "majorDimension": "ROWS",
+                    "values": [[1], ["foo"], [3.0]],
+                },
+                params={"valueInputOption": "USER_ENTERED"},
+            ),
+            mocker.call().json(),
+        ]
+    )