discourse/spec/services/flags/toggle_flag_spec.rb
Loïc Guitaut 64605519da DEV: Fix flaky specs related to flag services
Creating or updating flags generates global side effects. Sometimes it
seems the state can leak from the flag specs.

This is probably related to the use of `fab!`. This patch replaces those
calls with standard `let`s. While the overall performances of these
tests will be a little less good, their state should not leak anymore.
2024-10-18 17:47:09 +02:00

53 lines
1.4 KiB
Ruby

# frozen_string_literal: true
RSpec.describe(Flags::ToggleFlag) do
describe described_class::Contract, type: :model do
it { is_expected.to validate_presence_of(:flag_id) }
end
describe ".call" do
subject(:result) { described_class.call(**params, **dependencies) }
fab!(:current_user) { Fabricate(:admin) }
let(:flag) { Fabricate(:flag) }
let(:flag_id) { flag.id }
let(:params) { { flag_id: flag_id } }
let(:dependencies) { { guardian: current_user.guardian } }
context "when user is not allowed to perform the action" do
fab!(:current_user) { Fabricate(:user) }
it { is_expected.to fail_a_policy(:invalid_access) }
end
context "when contract is invalid" do
let(:flag_id) { nil }
it { is_expected.to fail_a_contract }
end
context "when model is not found" do
let(:flag_id) { 0 }
it { is_expected.to fail_to_find_a_model(:flag) }
end
context "when everything's ok" do
it { is_expected.to run_successfully }
it "toggles the flag" do
expect(result[:flag].enabled).to be false
end
it "logs the action" do
expect { result }.to change { UserHistory.count }.by(1)
expect(UserHistory.last).to have_attributes(
custom_type: "toggle_flag",
details: "flag: #{result[:flag].name}\nenabled: #{result[:flag].enabled}",
)
end
end
end
end