demarches-normaliennes/spec/models/concerns/treeable_concern_spec.rb

182 lines
5.8 KiB
Ruby

describe TreeableConcern do
class ChampsToTree
include TreeableConcern
attr_reader :root
def initialize(types_de_champ:)
@root = to_tree(types_de_champ:)
end
end
subject { ChampsToTree.new(types_de_champ:).root }
describe "to_tree" do
let(:procedure) { create(:procedure, types_de_champ_public:) }
let(:types_de_champ_public) { [] }
let(:types_de_champ) { procedure.active_revision.types_de_champ_public }
let(:header_1) { { type: :header_section, level: 1, stable_id: 99 } }
let(:header_1_2) { { type: :header_section, level: 2, stable_id: 199 } }
let(:header_2) { { type: :header_section, level: 1, stable_id: 299 } }
let(:champ_text) { { stable_id: 399 } }
let(:champ_textarea) { { type: :textarea, stable_id: 499 } }
let(:champ_explication) { { type: :explication, stable_id: 599 } }
let(:champ_communes) { { type: :communes, stable_id: 699 } }
let(:header_1_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 99 } }
let(:header_1_2_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 199 } }
let(:header_2_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 299 } }
let(:champ_text_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 399 } }
let(:champ_textarea_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 499 } }
let(:champ_explication_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 599 } }
let(:champ_communes_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 699 } }
context 'without section' do
let(:types_de_champ_public) do
[
champ_text, champ_textarea
]
end
it 'inlines champs at root level' do
expect(subject.size).to eq(types_de_champ.size)
expect(subject).to eq([champ_text_tdc, champ_textarea_tdc])
end
end
context 'with header_section and champs' do
let(:types_de_champ_public) do
[
header_1,
champ_explication,
champ_text,
header_2,
champ_textarea
]
end
it 'wraps champs within preview header section' do
expect(subject.size).to eq(2)
expect(subject).to eq([
[header_1_tdc, champ_explication_tdc, champ_text_tdc],
[header_2_tdc, champ_textarea_tdc]
])
end
end
context 'leading champs, and in between sections only' do
let(:champ_textarea_bis) { { type: :textarea, stable_id: 799 } }
let(:champ_textarea_bis_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 799 } }
let(:types_de_champ_public) do
[
champ_text,
champ_textarea,
header_1,
champ_explication,
champ_communes,
header_2,
champ_textarea_bis
]
end
it 'chunk by uniq champs' do
expect(subject.size).to eq(4)
expect(subject).to eq([
champ_text_tdc,
champ_textarea_tdc,
[header_1_tdc, champ_explication_tdc, champ_communes_tdc],
[header_2_tdc, champ_textarea_bis_tdc]
])
end
end
context 'with one sub sections' do
let(:types_de_champ_public) do
[
header_1,
champ_explication,
header_1_2,
champ_communes,
header_2,
champ_textarea
]
end
it 'chunk by uniq champs' do
expect(subject.size).to eq(2)
expect(subject).to eq([
[header_1_tdc, champ_explication_tdc, [header_1_2_tdc, champ_communes_tdc]],
[header_2_tdc, champ_textarea_tdc]
])
end
end
context 'with consecutive subsection' do
let(:header_1_2_1) { { type: :header_section, level: 2, stable_id: 799 } }
let(:header_1_2_2) { { type: :header_section, level: 2, stable_id: 899 } }
let(:header_1_2_3) { { type: :header_section, level: 2, stable_id: 999 } }
let(:header_1_2_1_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 799 } }
let(:header_1_2_2_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 899 } }
let(:header_1_2_3_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 999 } }
let(:types_de_champ_public) do
[
header_1,
header_1_2_1,
champ_text,
header_1_2_2,
champ_textarea,
header_1_2_3,
champ_communes
]
end
it 'chunk by uniq champs' do
expect(subject.size).to eq(1)
expect(subject).to eq([
[
header_1_tdc,
[header_1_2_1_tdc, champ_text_tdc],
[header_1_2_2_tdc, champ_textarea_tdc],
[header_1_2_3_tdc, champ_communes_tdc]
]
])
end
end
context 'with one sub sections and one subsub section' do
let(:header_1_2_3) { { type: :header_section, level: 3, stable_id: 799 } }
let(:header_1_2_3_tdc) { procedure.active_revision.types_de_champ_public.find { _1.stable_id == 799 } }
let(:types_de_champ_public) do
[
header_1,
champ_explication,
header_1_2,
champ_communes,
header_1_2_3,
champ_text,
header_2,
champ_textarea
]
end
it 'chunk by uniq champs' do
expect(subject.size).to eq(2)
expect(subject).to eq([
[
header_1_tdc,
champ_explication_tdc,
[
header_1_2_tdc,
champ_communes_tdc,
[
header_1_2_3_tdc, champ_text_tdc
]
]
],
[
header_2_tdc,
champ_textarea_tdc
]
])
end
end
end
end