ee/spec/features/projects/analytics/data_explorer_spec.rb (167 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Analytics Data Explorer', :js, feature_category: :product_analytics do let_it_be(:current_user) { create(:user) } let_it_be(:user) { current_user } let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, :repository, group: group) } let_it_be(:meta_response_with_data) { fixture_file('cube_js/meta_with_data.json', dir: 'ee') } let_it_be(:query_response_with_data) { fixture_file('cube_js/query_with_data.json', dir: 'ee') } let_it_be(:query_response_with_error) { fixture_file('cube_js/query_with_error.json', dir: 'ee') } let(:cube_meta_api_url) { "https://cube.example.com/cubejs-api/v1/meta" } let(:cube_dry_run_api_url) { "https://cube.example.com/cubejs-api/v1/dry-run" } let(:cube_load_api_url) { "https://cube.example.com/cubejs-api/v1/load" } subject(:visit_page) do visit project_analytics_dashboards_path(project) click_link "Data explorer" end shared_examples 'valid data explorer' do it 'renders the preview panels and the type selector' do visit_page expect(page).to have_content('Start by choosing a measure') end it 'renders the title input' do visit_page expect(page).to have_content('Visualization title') end it 'renders the type selector' do visit_page expect(page).to have_content('Data table') end end shared_examples 'selected measure behavior' do it 'selected measure behavior' do expect(find_by_testid('preview-visualization')) .to have_content('Event Count 335') end context 'when the visualization has content' do [ { name: 'LineChart', text: 'Line chart', content: 'Snowplow Tracked Events Count' }, { name: 'DataTable', text: 'Data table', content: 'Count 335' }, { name: 'SingleStat', text: 'Single statistic', content: '335' } ].each do |visualization| context "with #{visualization[:text]} visualization selected" do before do dropdown = find_by_testid('visualization-type-dropdown') dropdown.select visualization[:text] end it "shows the #{visualization[:text]} preview with content" do expect(find_by_testid('preview-visualization')).to have_content(visualization[:content]) end context 'with the code tab selected' do before do within_testid 'visualization-previewer' do click_button 'Code' end end it 'shows the visualization code' do yaml_snippet = "type: #{visualization[:name]}" expect(find_by_testid('preview-code')).to have_content(yaml_snippet) end end end end end context 'when the visualization does not have content' do [ { name: 'LineChart', text: 'Line chart', selector: 'dashboard-visualization-line-chart' }, { name: 'ColumnChart', text: 'Column chart', selector: 'dashboard-visualization-column-chart' } ].each do |visualization| context "with #{visualization[:text]} visualization selected" do before do dropdown = find_by_testid('visualization-type-dropdown') dropdown.select visualization[:text] end it "shows the #{visualization[:text]} preview with the selector" do expect(find_by_testid('preview-visualization')) .to have_selector("[data-testid=\"#{visualization[:selector]}\"]") end context 'with the code tab selected' do before do within_testid 'visualization-previewer' do click_button 'Code' end end it 'shows the visualization code' do yaml_snippet = "type: #{visualization[:name]}" expect(find_by_testid('preview-code')).to have_content(yaml_snippet) end end end end end end context 'with all required access and analytics settings configured' do context 'when a custom dashboard project has not been configured' do it 'does not render the Data explorer button' do setup_valid_state expect(page).not_to have_link(s_('Analytics|Data explorer')) end end context 'when a custom dashboard project has been configured' do before do create(:analytics_dashboards_pointer, :project_based, project: project) setup_valid_state end it_behaves_like 'valid data explorer' it 'renders the filtered search query builder' do visit_page expect(page).to have_selector('[data-testid="visualization-filtered-search"]') end it 'does not render the measure selection' do visit_page expect(page).not_to have_content('What metric do you want to visualize?') end context 'with a measure selected' do before do visit_page select_all_views_measure end it_behaves_like 'selected measure behavior' end def select_all_views_measure find_by_testid('visualization-filtered-search').click find_by_testid('filtered-search-suggestion', text: 'Measure').click find_by_testid('filtered-search-suggestion', text: 'Tracked Events Count').click end end def setup_valid_state sign_in(user) stub_feature_flags(product_analytics_features: true) stub_licensed_features(combined_project_analytics_dashboards: true, product_analytics: true) stub_application_setting(product_analytics_enabled?: true) stub_application_setting(product_analytics_data_collector_host: 'https://collector.example.com') stub_application_setting(product_analytics_configurator_connection_string: 'https://configurator.example.com') stub_application_setting(cube_api_base_url: 'https://cube.example.com') stub_application_setting(cube_api_key: '123') project.project_setting.update!({ product_analytics_instrumentation_key: 456 }) project.add_developer(user) project.reload stub_request(:get, cube_meta_api_url) .to_return(status: 200, body: meta_response_with_data, headers: {}) stub_request(:post, cube_dry_run_api_url) .to_return(status: 200, body: query_response_with_data, headers: {}) stub_request(:post, cube_load_api_url) .to_return(status: 200, body: query_response_with_data, headers: {}) end end end