You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gristlabs_grist-core/sandbox/grist/test_import_actions.py

204 lines
11 KiB

# pylint: disable=line-too-long
import logging
import test_engine
log = logging.getLogger(__name__)
class TestImportActions(test_engine.EngineTestCase):
def init_state(self):
# Add source table
self.apply_user_action(['AddTable', 'Source', [{'id': 'Name', 'type': 'Text'},
{'id': 'City', 'type': 'Text'},
{'id': 'Zip', 'type': 'Int'}]])
self.apply_user_action(['BulkAddRecord', 'Source', [1, 2], {'Name': ['John', 'Alison'],
'City': ['New York', 'Boston'],
'Zip': [3011, 7003]}])
self.assertTableData('_grist_Tables_column', cols="subset", data=[
["id", "colId", "type", "isFormula", "formula"],
[1, "manualSort", "ManualSortPos", False, ""],
[2, "Name", "Text", False, ""],
[3, "City", "Text", False, ""],
[4, "Zip", "Int", False, ""],
], rows=lambda r: r.parentId.id == 1)
# Add destination table which contains columns corresponding to source table
self.apply_user_action(['AddTable', 'Destination1', [{'id': 'Name', 'type': 'Text'},
{'id': 'City', 'type': 'Text'}]])
self.apply_user_action(['BulkAddRecord', 'Destination1', [1, 2], {'Name': ['Bob'],
'City': ['New York']}])
self.assertTableData('_grist_Tables_column', cols="subset", data=[
["id", "colId", "type", "isFormula", "formula"],
[5, "manualSort", "ManualSortPos", False, ""],
[6, "Name", "Text", False, ""],
[7, "City", "Text", False, ""],
], rows=lambda r: r.parentId.id == 2)
# Add destination table which has no columns corresponding to source table
self.apply_user_action(['AddTable', 'Destination2', [{'id': 'State', 'type': 'Text'}]])
self.apply_user_action(['BulkAddRecord', 'Destination2', [1, 2], {'State': ['NY']}])
self.assertTableData('_grist_Tables_column', cols="subset", data=[
["id", "colId", "type", "isFormula", "formula"],
[8, "manualSort", "ManualSortPos", False, ""],
[9, "State", "Text", False, ""]
], rows=lambda r: r.parentId.id == 3)
# Verify created tables
self.assertPartialData("_grist_Tables", ["id", "tableId"], [
[1, "Source"],
[2, "Destination1"],
[3, "Destination2"],
])
# Verify created sections
self.assertPartialData("_grist_Views_section", ["id", "tableRef", 'fields'], [
[1, 1, [1, 2, 3]], # section for "Source" table
[2, 1, [4, 5, 6]], # section for "Source" table
[3, 1, [7, 8, 9]], # section for "Source" table
[4, 2, [10, 11]], # section for "Destination1" table
[5, 2, [12, 13]], # section for "Destination1" table
[6, 2, [14, 15]], # section for "Destination1" table
[7, 3, [16]], # section for "Destination2" table
[8, 3, [17]], # section for "Destination2" table
[9, 3, [18]], # section for "Destination2" table
])
def test_transform(self):
# Add source and destination tables
self.init_state()
# Update transform while importing to destination table which have
# columns with the same names as source
self.apply_user_action(['GenImporterView', 'Source', 'Destination1', None, {}])
# Verify the new structure of source table and sections
# (two columns with special names were added)
self.assertTableData('_grist_Tables_column', cols="subset", data=[
["id", "colId", "type", "isFormula", "formula"],
[1, "manualSort", "ManualSortPos", False, ""],
[2, "Name", "Text", False, ""],
[3, "City", "Text", False, ""],
[4, "Zip", "Int", False, ""],
[10, "gristHelper_Import_Name", "Text", True, "$Name"],
[11, "gristHelper_Import_City", "Text", True, "$City"],
], rows=lambda r: r.parentId.id == 1)
self.assertTableData('Source', cols="all", data=[
["id", "Name", "City", "Zip", "gristHelper_Import_Name", "gristHelper_Import_City", "manualSort"],
[1, "John", "New York", 3011, "John", "New York", 1.0],
[2, "Alison", "Boston", 7003, "Alison", "Boston", 2.0],
])
self.assertPartialData("_grist_Views_section", ["id", "tableRef", 'fields'], [
[1, 1, [1, 2, 3]],
[2, 1, [4, 5, 6]],
[3, 1, [7, 8, 9]],
[4, 2, [10, 11]],
[5, 2, [12, 13]],
[6, 2, [14, 15]],
[7, 3, [16]],
[8, 3, [17]],
[9, 3, [18]],
[10, 1, [19, 20]], # new section for transform preview
])
# Apply useraction again to verify that old columns and sections are removing
# Update transform while importing to destination table which has no common columns with source
self.apply_user_action(['GenImporterView', 'Source', 'Destination2', None, {}])
# Verify the new structure of source table and sections (old special columns were removed
# and one new columns with empty formula were added)
self.assertTableData('_grist_Tables_column', cols="subset", data=[
["id", "colId", "type", "isFormula", "formula"],
[1, "manualSort", "ManualSortPos", False, ""],
[2, "Name", "Text", False, ""],
[3, "City", "Text", False, ""],
[4, "Zip", "Int", False, ""],
[10, "gristHelper_Import_State", "Text", True, ""]
], rows=lambda r: r.parentId.id == 1)
self.assertTableData('Source', cols="all", data=[
["id", "Name", "City", "Zip", "gristHelper_Import_State", "manualSort"],
[1, "John", "New York", 3011, "", 1.0],
[2, "Alison", "Boston", 7003, "", 2.0],
])
self.assertPartialData("_grist_Views_section", ["id", "tableRef", 'fields'], [
[1, 1, [1, 2, 3]],
[2, 1, [4, 5, 6]],
[3, 1, [7, 8, 9]],
[4, 2, [10, 11]],
[5, 2, [12, 13]],
[6, 2, [14, 15]],
[7, 3, [16]],
[8, 3, [17]],
[9, 3, [18]],
[10, 1, [19]], # new section for transform preview
])
def test_regenerate_importer_view(self):
# Generate without a destination table, and then with one. Ensure that we don't omit the
# actions needed to populate the table in the second call.
self.init_state()
self.apply_user_action(['GenImporterView', 'Source', None, None, {}])
out_actions = self.apply_user_action(['GenImporterView', 'Source', 'Destination1', None, {}])
self.assertPartialOutActions(out_actions, {
"stored": [
["BulkRemoveRecord", "_grist_Views_section_field", [19, 20, 21]],
["RemoveRecord", "_grist_Views_section", 10],
["BulkRemoveRecord", "_grist_Tables_column", [10, 11, 12]],
["RemoveColumn", "Source", "gristHelper_Import_Name"],
["RemoveColumn", "Source", "gristHelper_Import_City"],
["RemoveColumn", "Source", "gristHelper_Import_Zip"],
["AddColumn", "Source", "gristHelper_Import_Name", {"formula": "$Name", "isFormula": True, "type": "Text"}],
["AddRecord", "_grist_Tables_column", 10, {"colId": "gristHelper_Import_Name", "formula": "$Name", "isFormula": True, "label": "Name", "parentId": 1, "parentPos": 10.0, "type": "Text", "widgetOptions": ""}],
["AddColumn", "Source", "gristHelper_Import_City", {"formula": "$City", "isFormula": True, "type": "Text"}],
["AddRecord", "_grist_Tables_column", 11, {"colId": "gristHelper_Import_City", "formula": "$City", "isFormula": True, "label": "City", "parentId": 1, "parentPos": 11.0, "type": "Text", "widgetOptions": ""}],
["AddRecord", "_grist_Views_section", 10, {"borderWidth": 1, "defaultWidth": 100, "parentKey": "record", "sortColRefs": "[]", "tableRef": 1}],
["BulkAddRecord", "_grist_Views_section_field", [19, 20], {"colRef": [10, 11], "parentId": [10, 10], "parentPos": [19.0, 20.0]}],
# The actions to populate the removed and re-added columns should be there.
["BulkUpdateRecord", "Source", [1, 2], {"gristHelper_Import_City": ["New York", "Boston"]}],
["BulkUpdateRecord", "Source", [1, 2], {"gristHelper_Import_Name": ["John", "Alison"]}],
],
"calc": []
})
def test_transform_destination_new_table(self):
# Add source and destination tables
self.init_state()
# Update transform while importing to destination table which is "New Table"
self.apply_user_action(['GenImporterView', 'Source', None, None, {}])
# Verify the new structure of source table and sections (old special columns were removed
# and three new columns, which are the same as in source table were added)
self.assertTableData('_grist_Tables_column', cols="subset", data=[
["id", "colId", "type", "isFormula", "formula"],
[1, "manualSort", "ManualSortPos", False, ""],
[2, "Name", "Text", False, ""],
[3, "City", "Text", False, ""],
[4, "Zip", "Int", False, ""],
[10, "gristHelper_Import_Name", "Text", True, "$Name"],
[11, "gristHelper_Import_City", "Text", True, "$City"],
[12, "gristHelper_Import_Zip", "Int", True, "$Zip"],
], rows=lambda r: r.parentId.id == 1)
self.assertTableData('Source', cols="all", data=[
["id", "Name", "City", "Zip", "gristHelper_Import_Name", "gristHelper_Import_City", "gristHelper_Import_Zip", "manualSort"],
[1, "John", "New York", 3011, "John", "New York", 3011, 1.0],
[2, "Alison", "Boston", 7003, "Alison", "Boston", 7003, 2.0],
])
self.assertPartialData("_grist_Views_section", ["id", "tableRef", 'fields'], [
[1, 1, [1, 2, 3]],
[2, 1, [4, 5, 6]],
[3, 1, [7, 8, 9]],
[4, 2, [10, 11]],
[5, 2, [12, 13]],
[6, 2, [14, 15]],
[7, 3, [16]],
[8, 3, [17]],
[9, 3, [18]],
[10, 1, [19, 20, 21]], # new section for transform preview
])