require "spec_helper" describe Docks::Helpers::Render do subject do Class.new { include Docks::Helpers::Render }.new end describe "#render_everything" do let(:pattern) { Docks::Containers::Pattern.new(name: "foo") } let(:component) { Docks::Containers::Component.new(name: "foo") } before(:each) { subject.instance_variable_set(:@pattern, pattern) } describe "markup" do let(:markup) { "<% 5.times do %>foo<% end %>" } let(:output) { "foo" * 5 } before(:each) { pattern.add(:style, component) } it "does nothing for non-symbols" do pattern.param = OpenStruct.new(markup: markup) expect(subject).to_not receive(:render) subject.render_everything end it "does nothing for symbols without helper or markup" do expect(subject).to_not receive(:render) subject.render_everything end it "renders markup on the component" do component.markup = markup expect(subject).to receive(:render).with(inline: markup, layout: false).and_return(output) subject.render_everything expect(component.markup).to eq output end it "renders helper on the component" do component.helper = markup expect(subject).to receive(:render).with(inline: markup, layout: false).and_return(output) subject.render_everything expect(component.markup).to eq output end it "renders markup on nested variations" do state = Docks::Containers::State.new(name: "foo--bar", markup: markup) component.states << state expect(subject).to receive(:render).with(inline: markup, layout: false).and_return(output) subject.render_everything expect(state.markup).to eq output end it "renders helpers on nested variations" do state = Docks::Containers::State.new(name: "foo--bar", helper: markup) component.states << state expect(subject).to receive(:render).with(inline: markup, layout: false).and_return(output) subject.render_everything expect(state.markup).to eq output end end describe "description" do let(:description) { "<% %w(foo bar baz).each do |a| %><%= a %> <% end %>" } let(:output) { "foo bar baz" } it "renders the pattern description" do pattern.description = description expect(subject).to receive(:render).with(inline: description, layout: false).and_return(output) subject.render_everything expect(pattern.description).to eq output end it "renders the description on symbols" do component.description = description pattern.add(:style, component) expect(subject).to receive(:render).with(inline: description, layout: false).and_return(output) subject.render_everything expect(component.description).to eq output end it "renders the description on nested objects" do param = Docks::OpenStruct.new(description: description) component.params = [param] pattern.add(:style, component) expect(subject).to receive(:render).with(inline: description, layout: false).and_return(output) subject.render_everything expect(param.description).to eq output end it "doesn't kill the kind of object a nested object originally was" do param = Docks::OpenStruct.new(description: description) component.params = [param] pattern.add(:style, component) expect(subject).to receive(:render).with(inline: description, layout: false).and_return(output) subject.render_everything expect(component.params.first).to be param end it "renders @link declarations" do allow(subject).to receive(:render) { |opts| opts[:inline] } pattern.description = "foo bar baz" expect(subject).to receive(:docks_path).with("Baz", hash_including(:language)).and_return("/pattern-library/baz") subject.render_everything expect(pattern.description).to eq "foo bar baz" end it "calls the theme's render description helper" do allow(subject).to receive(:render) { |opts| opts[:inline] } pattern.description = "foo bar" expect(subject).to receive(:render_description_with_theme).with("foo bar", hash_including(:language)).and_return("baz qux") subject.render_everything expect(pattern.description).to eq "baz qux" end end end end