def test_import_v1_chart_multiple(self): """Test that a dataset can be imported multiple times""" contents = { "metadata.yaml": yaml.safe_dump(chart_metadata_config), "databases/imported_database.yaml": yaml.safe_dump(database_config), "datasets/imported_dataset.yaml": yaml.safe_dump(dataset_config), "charts/imported_chart.yaml": yaml.safe_dump(chart_config), } command = ImportChartsCommand(contents) command.run() command.run() dataset = (db.session.query(SqlaTable).filter_by( uuid=dataset_config["uuid"]).one()) charts = db.session.query(Slice).filter_by( datasource_id=dataset.id).all() assert len(charts) == 1 database = dataset.database db.session.delete(charts[0]) db.session.delete(dataset) db.session.delete(database) db.session.commit()
def _get_uuids(cls) -> Set[str]: # pylint: disable=protected-access return ( ImportDatabasesCommand._get_uuids() | ImportDatasetsCommand._get_uuids() | ImportChartsCommand._get_uuids() | ImportDashboardsCommand._get_uuids() )
def test_import_v1_chart_validation(self): """Test different validations applied when importing a chart""" # metadata.yaml must be present contents = { "databases/imported_database.yaml": yaml.safe_dump(database_config), "datasets/imported_dataset.yaml": yaml.safe_dump(dataset_config), "charts/imported_chart.yaml": yaml.safe_dump(chart_config), } command = ImportChartsCommand(contents) with pytest.raises(IncorrectVersionError) as excinfo: command.run() assert str(excinfo.value) == "Missing metadata.yaml" # version should be 1.0.0 contents["metadata.yaml"] = yaml.safe_dump( { "version": "2.0.0", "type": "SqlaTable", "timestamp": "2020-11-04T21:27:44.423819+00:00", } ) command = ImportChartsCommand(contents) with pytest.raises(IncorrectVersionError) as excinfo: command.run() assert str(excinfo.value) == "Must be equal to 1.0.0." # type should be Slice contents["metadata.yaml"] = yaml.safe_dump(database_metadata_config) command = ImportChartsCommand(contents) with pytest.raises(CommandInvalidError) as excinfo: command.run() assert str(excinfo.value) == "Error importing chart" assert excinfo.value.normalized_messages() == { "metadata.yaml": {"type": ["Must be equal to Slice."]} } # must also validate datasets and databases broken_config = database_config.copy() del broken_config["database_name"] contents["metadata.yaml"] = yaml.safe_dump(chart_metadata_config) contents["databases/imported_database.yaml"] = yaml.safe_dump(broken_config) command = ImportChartsCommand(contents) with pytest.raises(CommandInvalidError) as excinfo: command.run() assert str(excinfo.value) == "Error importing chart" assert excinfo.value.normalized_messages() == { "databases/imported_database.yaml": { "database_name": ["Missing data for required field."], } }
def test_import_v1_chart(self): """Test that we can import a chart""" contents = { "metadata.yaml": yaml.safe_dump(chart_metadata_config), "databases/imported_database.yaml": yaml.safe_dump(database_config), "datasets/imported_dataset.yaml": yaml.safe_dump(dataset_config), "charts/imported_chart.yaml": yaml.safe_dump(chart_config), } command = ImportChartsCommand(contents) command.run() chart: Slice = ( db.session.query(Slice).filter_by(uuid=chart_config["uuid"]).one() ) dataset = chart.datasource assert json.loads(chart.params) == { "color_picker": {"a": 1, "b": 135, "g": 122, "r": 0}, "datasource": dataset.uid, "js_columns": ["color"], "js_data_mutator": "data => data.map(d => ({\\n ...d,\\n color: colors.hexToRGB(d.extraProps.color)\\n}));", "js_onclick_href": "", "js_tooltip": "", "line_column": "path_json", "line_type": "json", "line_width": 150, "mapbox_style": "mapbox://styles/mapbox/light-v9", "reverse_long_lat": False, "row_limit": 5000, "slice_id": 43, "time_grain_sqla": None, "time_range": " : ", "viewport": { "altitude": 1.5, "bearing": 0, "height": 1094, "latitude": 37.73671752604488, "longitude": -122.18885402582598, "maxLatitude": 85.05113, "maxPitch": 60, "maxZoom": 20, "minLatitude": -85.05113, "minPitch": 0, "minZoom": 0, "pitch": 0, "width": 669, "zoom": 9.51847667620428, }, "viz_type": "deck_path", } dataset = ( db.session.query(SqlaTable).filter_by(uuid=dataset_config["uuid"]).one() ) assert dataset.table_name == "imported_dataset" assert chart.table == dataset assert json.loads(chart.query_context) == { "datasource": {"id": dataset.id, "type": "table"}, "force": False, "queries": [ { "time_range": " : ", "filters": [], "extras": { "time_grain_sqla": None, "having": "", "having_druid": [], "where": "", }, "applied_time_extras": {}, "columns": [], "metrics": [], "annotation_layers": [], "row_limit": 5000, "timeseries_limit": 0, "order_desc": True, "url_params": {}, "custom_params": {}, "custom_form_data": {}, } ], "result_format": "json", "result_type": "full", } database = ( db.session.query(Database).filter_by(uuid=database_config["uuid"]).one() ) assert database.database_name == "imported_database" assert chart.table.database == database db.session.delete(chart) db.session.delete(dataset) db.session.delete(database) db.session.commit()
def test_import_v1_chart(self, mock_g): """Test that we can import a chart""" mock_g.user = security_manager.find_user("admin") contents = { "metadata.yaml": yaml.safe_dump(chart_metadata_config), "databases/imported_database.yaml": yaml.safe_dump(database_config), "datasets/imported_dataset.yaml": yaml.safe_dump(dataset_config), "charts/imported_chart.yaml": yaml.safe_dump(chart_config), } command = ImportChartsCommand(contents) command.run() chart: Slice = (db.session.query(Slice).filter_by( uuid=chart_config["uuid"]).one()) dataset = chart.datasource assert json.loads(chart.params) == { "color_picker": { "a": 1, "b": 135, "g": 122, "r": 0 }, "datasource": dataset.uid, "js_columns": ["color"], "js_data_mutator": "data => data.map(d => ({\\n ...d,\\n color: colors.hexToRGB(d.extraProps.color)\\n}));", "js_onclick_href": "", "js_tooltip": "", "line_column": "path_json", "line_type": "json", "line_width": 150, "mapbox_style": "mapbox://styles/mapbox/light-v9", "reverse_long_lat": False, "row_limit": 5000, "slice_id": 43, "time_grain_sqla": None, "time_range": " : ", "viewport": { "altitude": 1.5, "bearing": 0, "height": 1094, "latitude": 37.73671752604488, "longitude": -122.18885402582598, "maxLatitude": 85.05113, "maxPitch": 60, "maxZoom": 20, "minLatitude": -85.05113, "minPitch": 0, "minZoom": 0, "pitch": 0, "width": 669, "zoom": 9.51847667620428, }, "viz_type": "deck_path", } dataset = (db.session.query(SqlaTable).filter_by( uuid=dataset_config["uuid"]).one()) assert dataset.table_name == "imported_dataset" assert chart.table == dataset database = (db.session.query(Database).filter_by( uuid=database_config["uuid"]).one()) assert database.database_name == "imported_database" assert chart.table.database == database assert chart.owners == [mock_g.user] chart.owners = [] dataset.owners = [] database.owners = [] db.session.delete(chart) db.session.delete(dataset) db.session.delete(database) db.session.commit()
def _get_uuids(cls) -> Set[str]: return (ImportDatabasesCommand._get_uuids() | ImportDatasetsCommand._get_uuids() | ImportChartsCommand._get_uuids() | ImportDashboardsCommand._get_uuids())