discourse/spec/lib/wizard/wizard_spec.rb

233 lines
7.1 KiB
Ruby

# frozen_string_literal: true
require 'wizard'
RSpec.describe Wizard do
fab!(:admin) { Fabricate(:admin) }
before do
SiteSetting.wizard_enabled = true
end
describe "defaults" do
it "has default values" do
wizard = Wizard.new(Fabricate.build(:moderator))
expect(wizard.steps).to be_empty
expect(wizard.user).to be_present
end
end
describe "append_step" do
let(:user) { Fabricate.build(:moderator) }
let(:wizard) { Wizard.new(user) }
let(:step1) { wizard.create_step('first-step') }
let(:step2) { wizard.create_step('second-step') }
it "works with a block format" do
wizard.append_step('wat') do |step|
expect(step).to be_present
end
expect(wizard.steps.size).to eq(1)
end
it "adds the step correctly" do
expect(step1.index).to be_blank
wizard.append_step(step1)
expect(wizard.steps.size).to eq(1)
expect(wizard.start).to eq(step1)
expect(step1.next).to be_blank
expect(step1.previous).to be_blank
expect(step1.index).to eq(0)
expect(step1.fields).to be_empty
field = step1.add_field(id: 'test', type: 'text')
expect(step1.fields).to eq([field])
end
it "sequences multiple steps" do
wizard.append_step(step1)
wizard.append_step(step2)
expect(wizard.steps.size).to eq(2)
expect(wizard.start).to eq(step1)
expect(step1.next).to eq(step2)
expect(step1.previous).to be_blank
expect(step2.previous).to eq(step1)
expect(step1.index).to eq(0)
expect(step2.index).to eq(1)
end
end
describe ".exclude_step" do
let(:user) { Fabricate.build(:moderator) }
let(:wizard) { Wizard.new(user) }
it 'excludes steps even if they are added via append_step' do
wizard.append_step('first') do |step|
step.add_field(id: 'another_element', type: 'text')
end
Wizard.exclude_step("random-step123")
wizard.append_step('random-step123') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('finished')
expect(wizard.steps.map(&:id)).to eq(['first', 'finished'])
end
end
describe "#append_step with after specified" do
let(:user) { Fabricate.build(:moderator) }
let(:wizard) { Wizard.new(user) }
it 'inserts steps after the proper step' do
wizard.append_step('first') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('second') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('actually-second', after: 'first') do |step|
step.add_field(id: 'another_element', type: 'text')
end
expect(wizard.steps.sort_by(&:index).map(&:id)).to eq(["first", "actually-second", "second"])
expect(wizard.steps.map(&:index).sort).to eq([0, 1, 2])
end
it 'inserts steps at the end if the after value does not match an existing step' do
wizard.append_step('first') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('second') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('should_be_last', after: 'abcdefghi') do |step|
step.add_field(id: 'another_element', type: 'text')
end
expect(wizard.steps.sort_by(&:index).map(&:id)).to eq(["first", "second", "should_be_last"])
expect(wizard.steps.map(&:index).sort).to eq([0, 1, 2])
end
it 'inserts steps at the end' do
wizard.append_step('first') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('second') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('last', after: 'second') do |step|
step.add_field(id: 'another_element', type: 'text')
end
expect(wizard.steps.sort_by(&:index).map(&:id)).to eq(["first", "second", "last"])
expect(wizard.steps.map(&:index).sort).to eq([0, 1, 2])
end
end
describe "completed?" do
let(:user) { Fabricate.build(:moderator) }
let(:wizard) { Wizard.new(user) }
it "is complete when all steps with fields have logs" do
wizard.append_step('first') do |step|
step.add_field(id: 'element', type: 'text')
end
wizard.append_step('second') do |step|
step.add_field(id: 'another_element', type: 'text')
end
wizard.append_step('finished')
expect(wizard.start.id).to eq('first')
expect(wizard.completed_steps?('first')).to eq(false)
expect(wizard.completed_steps?('second')).to eq(false)
expect(wizard.completed?).to eq(false)
updater = wizard.create_updater('first', element: 'test')
updater.update
expect(wizard.start.id).to eq('second')
expect(wizard.completed_steps?('first')).to eq(true)
expect(wizard.completed?).to eq(false)
updater = wizard.create_updater('second', element: 'test')
updater.update
expect(wizard.completed_steps?('first')).to eq(true)
expect(wizard.completed_steps?('second')).to eq(true)
expect(wizard.completed_steps?('finished')).to eq(false)
expect(wizard.completed?).to eq(true)
# Once you've completed the wizard start at the beginning
expect(wizard.start.id).to eq('first')
end
end
describe "#requires_completion?" do
def build_simple(user)
wizard = Wizard.new(user)
wizard.append_step('simple') do |step|
step.add_field(id: 'name', type: 'text')
end
wizard
end
it "is false for anonymous" do
expect(build_simple(nil).requires_completion?).to eq(false)
end
it "is false for regular users" do
expect(build_simple(Fabricate.build(:user)).requires_completion?).to eq(false)
end
it "it's false when the wizard is disabled" do
SiteSetting.wizard_enabled = false
expect(build_simple(admin).requires_completion?).to eq(false)
end
it "its false when the wizard is bypassed" do
SiteSetting.bypass_wizard_check = true
expect(build_simple(admin).requires_completion?).to eq(false)
end
it "its automatically bypasses after you reach topic limit" do
Fabricate(:topic)
wizard = build_simple(admin)
wizard.max_topics_to_require_completion = Topic.count - 1
expect(wizard.requires_completion?).to eq(false)
expect(SiteSetting.bypass_wizard_check).to eq(true)
end
it "it's true for the first admin who logs in" do
second_admin = Fabricate(:admin)
UserAuthToken.generate!(user_id: second_admin.id)
expect(build_simple(admin).requires_completion?).to eq(false)
expect(build_simple(second_admin).requires_completion?).to eq(true)
end
it "is false for staff when complete" do
wizard = build_simple(admin)
updater = wizard.create_updater('simple', name: 'Evil Trout')
updater.update
expect(wizard.requires_completion?).to eq(false)
# It's also false for another user
wizard = build_simple(admin)
expect(wizard.requires_completion?).to eq(false)
end
end
end