# frozen_string_literal: true require 'spec_helper' require 'rack/test' require 'split/dashboard' describe Split::Dashboard do include Rack::Test::Methods def app @app ||= Split::Dashboard end def link(color) Split::Alternative.new(color, experiment.name) end let(:experiment) { Split::ExperimentCatalog.find_or_create("link_color", "blue", "red") } let(:experiment_with_goals) { Split::ExperimentCatalog.find_or_create({"link_color" => ["goal_1", "goal_2"]}, "blue", "red") } let(:metric) { Split::Metric.find_or_create(name: 'testmetric', experiments: [experiment, experiment_with_goals]) } let(:red_link) { link("red") } let(:blue_link) { link("blue") } it "should respond to /" do get '/' expect(last_response).to be_ok end context "start experiment manually" do before do Split.configuration.start_manually = true end context "experiment without goals" do it "should display a Start button" do experiment get '/' expect(last_response.body).to include('Start') post "/start?experiment=#{experiment.name}" get '/' expect(last_response.body).to include('Reset Data') expect(last_response.body).not_to include('Metrics:') end end context "experiment with metrics" do it "should display the names of associated metrics" do metric get '/' expect(last_response.body).to include('Metrics:testmetric') end end context "with goals" do it "should display a Start button" do experiment_with_goals get '/' expect(last_response.body).to include('Start') post "/start?experiment=#{experiment.name}" get '/' expect(last_response.body).to include('Reset Data') end end end describe "index page" do context "with winner" do before { experiment.winner = 'red' } it "displays `Reopen Experiment` button" do get '/' expect(last_response.body).to include('Reopen Experiment') end end context "without winner" do it "should not display `Reopen Experiment` button" do get '/' expect(last_response.body).to_not include('Reopen Experiment') end end end describe "reopen experiment" do before { experiment.winner = 'red' } it 'redirects' do post "/reopen?experiment=#{experiment.name}" expect(last_response).to be_redirect end it "removes winner" do post "/reopen?experiment=#{experiment.name}" expect(experiment).to_not have_winner end it "keeps existing stats" do red_link.participant_count = 5 blue_link.participant_count = 7 experiment.winner = 'blue' post "/reopen?experiment=#{experiment.name}" expect(red_link.participant_count).to eq(5) expect(blue_link.participant_count).to eq(7) end end it "should reset an experiment" do red_link.participant_count = 5 blue_link.participant_count = 7 experiment.winner = 'blue' post "/reset?experiment=#{experiment.name}" expect(last_response).to be_redirect new_red_count = red_link.participant_count new_blue_count = blue_link.participant_count expect(new_blue_count).to eq(0) expect(new_red_count).to eq(0) expect(experiment.winner).to be_nil end it "should delete an experiment" do delete "/experiment?experiment=#{experiment.name}" expect(last_response).to be_redirect expect(Split::ExperimentCatalog.find(experiment.name)).to be_nil end it "should mark an alternative as the winner" do expect(experiment.winner).to be_nil post "/experiment?experiment=#{experiment.name}", :alternative => 'red' expect(last_response).to be_redirect expect(experiment.winner.name).to eq('red') end it "should display the start date" do experiment_start_time = Time.parse('2011-07-07') expect(Time).to receive(:now).at_least(:once).and_return(experiment_start_time) experiment get '/' expect(last_response.body).to include('2011-07-07') end it "should handle experiments without a start date" do experiment_start_time = Time.parse('2011-07-07') expect(Time).to receive(:now).at_least(:once).and_return(experiment_start_time) Split.redis.hdel(:experiment_start_times, experiment.name) get '/' expect(last_response.body).to include('Unknown') end end