# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. import pytest from superset.reports.models import ReportSchedule def test_get_native_filters_params(): """ Test the ``get_native_filters_params`` method. """ report_schedule = ReportSchedule() report_schedule.extra = { "dashboard": { "nativeFilters": [ { "nativeFilterId": "filter_id", "columnName": "column_name", "filterType": "filter_select", "filterValues": ["value1", "value2"], } ] } } assert report_schedule.get_native_filters_params() == ( "(filter_id:(extraFormData:(filters:!((col:column_name,op:IN,val:!(value1,value2)))),filterState:(label:column_name,validateStatus:!f,value:!(value1,value2)),id:filter_id,ownState:()))" ) def test_get_native_filters_params_multiple_filters(): """ Test the ``get_native_filters_params`` method with multiple native filters. """ report_schedule = ReportSchedule() report_schedule.extra = { "dashboard": { "nativeFilters": [ { "nativeFilterId": "filter_id_1", "filterType": "filter_select", "columnName": "column_name_1", "filterValues": ["value1", "value2"], }, { "nativeFilterId": "filter_id_2", "filterType": "filter_select", "columnName": "column_name_2", "filterValues": ["value3", "value4"], }, ] } } assert report_schedule.get_native_filters_params() == ( "(filter_id_1:(extraFormData:(filters:!((col:column_name_1,op:IN,val:!(value1,value2)))),filterState:(label:column_name_1,validateStatus:!f,value:!(value1,value2)),id:filter_id_1,ownState:()),filter_id_2:(extraFormData:(filters:!((col:column_name_2,op:IN,val:!(value3,value4)))),filterState:(label:column_name_2,validateStatus:!f,value:!(value3,value4)),id:filter_id_2,ownState:()))" ) def test_report_generate_native_filter_no_values(): """ Test the ``_generate_native_filter`` method with no values. """ report_schedule = ReportSchedule() native_filter_id = "filter_id" column_name = "column_name" filter_type = "filter_select" values = None assert report_schedule._generate_native_filter( native_filter_id, filter_type, column_name, values ) == { "filter_id": { "id": "filter_id", "extraFormData": { "filters": [{"col": "column_name", "op": "IN", "val": []}] }, "filterState": { "label": "column_name", "validateStatus": False, "value": [], }, "ownState": {}, } } def test_get_native_filters_params_invalid_structure(): """ Test the ``get_native_filters_params`` method with invalid structure. """ report_schedule = ReportSchedule() report_schedule.extra = { "dashboard": { "nativeFilters": [ { "nativeFilterId": "filter_id", "columnName": "column_name", "filterType": "filter_select", # Missing "filterValues" key } ] } } with pytest.raises(KeyError, match="'filterValues'"): report_schedule.get_native_filters_params() # todo(hugh): how do we want to handle this case? # def test_report_generate_native_filter_invalid_filter_id(): # """ # Test the ``_generate_native_filter`` method with invalid filter id. # """ # report_schedule = ReportSchedule() # native_filter_id = None # column_name = "column_name" # values = ["value1", "value2"] # assert report_schedule._generate_native_filter( # native_filter_id, column_name, values # ) == {} def test_report_generate_native_filter(): """ Test the ``_generate_native_filter`` method. """ report_schedule = ReportSchedule() native_filter_id = "filter_id" filter_type = "filter_select" column_name = "column_name" values = ["value1", "value2"] assert report_schedule._generate_native_filter( native_filter_id, filter_type, column_name, values ) == { "filter_id": { "extraFormData": { "filters": [ {"col": "column_name", "op": "IN", "val": ["value1", "value2"]} ] }, "filterState": { "label": "column_name", "validateStatus": False, "value": ["value1", "value2"], }, "id": "filter_id", "ownState": {}, } } def test_get_native_filters_params_empty(): """ Test the ``get_native_filters_params`` method with empty extra. """ report_schedule = ReportSchedule() report_schedule.extra = {} assert report_schedule.get_native_filters_params() == "()" def test_get_native_filters_params_no_native_filters(): """ Test the ``get_native_filters_params`` method with no native filters. """ report_schedule = ReportSchedule() report_schedule.extra = {"dashboard": {"nativeFilters": []}} assert report_schedule.get_native_filters_params() == "()" def test_report_generate_native_filter_empty_values(): """ Test the ``_generate_native_filter`` method with empty values. """ report_schedule = ReportSchedule() native_filter_id = "filter_id" filter_type = "filter_select" column_name = "column_name" values = [] assert report_schedule._generate_native_filter( native_filter_id, filter_type, column_name, values ) == { "filter_id": { "extraFormData": { "filters": [{"col": "column_name", "op": "IN", "val": []}] }, "filterState": { "label": "column_name", "validateStatus": False, "value": [], }, "id": "filter_id", "ownState": {}, } } def test_report_generate_native_filter_no_column_name(): """ Test the ``_generate_native_filter`` method with no column name. """ report_schedule = ReportSchedule() native_filter_id = "filter_id" filter_type = "filter_select" column_name = "" values = ["value1", "value2"] assert report_schedule._generate_native_filter( native_filter_id, filter_type, column_name, values ) == { "filter_id": { "extraFormData": { "filters": [{"col": "", "op": "IN", "val": ["value1", "value2"]}] }, "filterState": { "label": "", "validateStatus": False, "value": ["value1", "value2"], }, "id": "filter_id", "ownState": {}, } }