"""Tests for features logic""" import pytest from unittest.mock import MagicMock from flask import g from pythonfeatures import pythonfeatures from charts import features as features from charts import api def test_get_controlled_chart_feature_flags(mock_get_all_feature_flags: MagicMock) -> None: """Test controlled ffs are returned based on ff permissions.""" expected_response = ['insights_chart_youtube_daily'] response = features.get_controlled_chart_feature_flags() mock_get_all_feature_flags.assert_called() assert response == expected_response def test_ff_chart_sql_filter_no_charts_filter() -> None: expected_response = "(dc.type != 'spotify_nmf')" response = features.ff_chart_sql_filter([]) assert response == expected_response def test_ff_chart_sql_filter_charts_filter() -> None: expected_response = "(dc.type != 'spotify_nmf' AND concat(dc.platform,'_',dc.frequency) not in ('youtube_daily','itunes_weekly'))" response = features.ff_chart_sql_filter(['insights_chart_youtube_daily', 'insights_chart_itunes_weekly']) assert response == expected_response def test_get_ff_charts_sql_filter(mock_get_all_feature_flags: MagicMock) -> None: expected_response = "(dc.type != 'spotify_nmf' AND concat(dc.platform,'_',dc.frequency) not in ('youtube_daily'))" response = features.get_ff_charts_sql_filter() assert response == expected_response def test_get_show_sme_data_flag_with_sme_brand() -> None: """Test that SME brand bypasses feature flag check.""" with api.app.test_request_context(): pythonfeatures.get_single_feature = MagicMock() mock_request_context = MagicMock() mock_request_context.brand = 'sme' setattr(g, "request_context", mock_request_context) response = features.get_show_sme_data_flag() assert not pythonfeatures.get_single_feature.called assert response is True def test_get_show_sme_data_flag_with_non_sme_brand() -> None: """Test that non-SME brand uses feature flag.""" with api.app.test_request_context(): mock_ff_response = MagicMock() mock_ff_response.message = 'enabled' pythonfeatures.get_single_feature = MagicMock(return_value=mock_ff_response) mock_request_context = MagicMock() mock_request_context.brand = 'other' setattr(g, "request_context", mock_request_context) response = features.get_show_sme_data_flag() pythonfeatures.get_single_feature.assert_called_once_with('show_sme_data', mock_request_context) assert response is True def test_get_show_sme_data_flag_without_brand() -> None: """Test that missing brand attribute uses feature flag.""" with api.app.test_request_context(): mock_ff_response = MagicMock() mock_ff_response.message = 'control' pythonfeatures.get_single_feature = MagicMock(return_value=mock_ff_response) mock_request_context = MagicMock(spec=[]) # Mock with no attributes setattr(g, "request_context", mock_request_context) response = features.get_show_sme_data_flag() pythonfeatures.get_single_feature.assert_called_once_with('show_sme_data', mock_request_context) assert response is False def test_get_show_sme_data_flag_with_none_brand() -> None: """Test that None brand uses feature flag.""" with api.app.test_request_context(): mock_ff_response = MagicMock() mock_ff_response.message = 'enabled' pythonfeatures.get_single_feature = MagicMock(return_value=mock_ff_response) mock_request_context = MagicMock() mock_request_context.brand = None setattr(g, "request_context", mock_request_context) response = features.get_show_sme_data_flag() pythonfeatures.get_single_feature.assert_called_once_with('show_sme_data', mock_request_context) assert response is True