# -*- encoding : utf-8 -*- describe Card::Content::Chunk::Nest, "Inclusion" do context "syntax parsing" do let :instance do described_class.new(described_class.full_match(@chunk), nil) end let(:options) { instance.options } let(:name) { instance.name } def chunk_nest chunk described_class.new(described_class.full_match(chunk), nil) end it "ignores invisible comments" do expect(render_content("{{## now you see nothing}}")).to eq("") end it "handles visible comments" do expect(render_content("{{# now you see me}}")) .to eq("") end it "handles weird characters in nest comments" do expect(render_content("{{# -->}}")).to eq("") end it "handles empty nests" do @chunk = "{{ }}" expect(name).to eq("") expect(options[:nest_syntax]).to eq(" ") end it "handles empty nests with pipe" do @chunk = "{{|}}" expect(name).to eq("") expect(options[:nest_syntax]).to eq("|") end it "handles no pipes" do @chunk = "{{toy}}" expect(name).to eq("toy") expect(options[:nest_name]).to eq("toy") expect(options.key?(:view)).to eq(false) end it "strips the name" do @chunk = "{{ toy }}" expect(name).to eq("toy") end it "strips html tags" do @chunk = "{{ toy }}" expect(name).to eq("toy") end it "strips html tags with pipe" do @chunk = "{{ toy|open }}" expect(name).to eq("toy") expect(options[:view]).to eq("open") end it "handles single pipe" do @chunk = "{{toy|view:link;hide:me}}" expect(options[:nest_name]).to eq("toy") expect(options[:view]).to eq("link") expect(options[:hide]).to eq("me") expect(options.key?(:items)).to eq(false) end it "handles multiple pipes" do @chunk = "{{box|open|closed}}" expect(options[:nest_name]).to eq("box") expect(options[:view]).to eq("open") expect(options[:items][:view]).to eq("closed") expect(options[:items].key?(:items)).to eq(false) end it "handles multiple pipes with blank lists" do @chunk = "{{box||closed}}" expect(options[:nest_name]).to eq("box") expect(options[:view]).to eq(nil) expect(options[:items][:view]).to eq("closed") end it "treats :item as view of next level" do @chunk = "{{toy|link;item:name}}" expect(options[:nest_name]).to eq("toy") expect(options[:view]).to eq("link") expect(options[:items][:view]).to eq("name") end it "#each_option should work" do @chunk = "{{}}" expect { |b| instance.send(:each_option, "", &b) }.not_to yield_control expect { |b| instance.send(:each_option, nil, &b) }.not_to yield_control expect { |b| instance.send(:each_option, "a:b;c:4", &b) } .to yield_successive_args(%w[a b], %w[c 4]) expect { |b| instance.send(:each_option, "d:b;e:4; ", &b) } .to yield_successive_args(%w[d b], %w[e 4]) end end context "rendering" do it "handles absolute names" do create! "Alpha", "Pooey" beta = create! "Beta", "{{Alpha}}" result = beta.format.render_core assert_view_select result, 'div[class~="d0-card-content"]', "Pooey" end it "handles simple relative names" do alpha = create! "Alpha", "{{#{Card::Name.joint}Beta}}" create! "Beta" create! "#{alpha.name}#{Card::Name.joint}Beta", "Woot" assert_view_select alpha.format.render_core, "div[class~=d0-card-content]", "Woot" end it "handles complex relative names" do bob_city = create! "bob+city", "Sparta" Card::Auth.as_bot do create! "address+*right+*structure", "{{_left+city}}" end bob_address = create! "bob+address" r = bob_address.reload.format.render_core assert_view_select r, "div[class~=d0-card-content]", "Sparta" expect(Card.fetch("bob+address").nestees.map(&:name)) .to eq([bob_city.name]) end it "handles nesting" do alpha = create! "Alpha", "{{Beta}}" create! "Beta", "{{Delta}}" create! "Delta", "Booya" r = alpha.format.render_core assert_view_select r, "div[class~=d0-card-content]" expect(r).to match(/Booya/) end it "handles options when nesting" do Card.create! type: "Pointer", name: "Livable", content: "[[Earth]]" create! "Earth" expect(render_content("{{Livable|core;item:link}}")) .to eq(render_content("{{Livable|core|link}}")) expect(render_content("{{Livable|core;item:name}}")) .to eq(render_content("{{Livable|core|name}}")) end it "prevents recursion" do create! "Oak", "{{Quentin}}" create! "Quentin", "{{Admin}}" adm = Card["Quentin"] adm.update_attributes content: "{{Oak}}" expect { adm.format.render_core }.to raise_error(Card::Error::UserError, /too deep/) end it "handles missing cards" do @a = create! "boo", "hey {{+there}}" r = @a.format.render_core assert_view_select( r, 'div[data-card-name="boo+there"][class~="missing-view"]' ) end it "handles structured cards" do create!("age") Card["*template"] specialtype = Card.create type_code: :cardtype, name: "SpecialType" specialtype_template = specialtype.fetch(trait: :type, new: {}) .fetch(trait: :structure, new: {}) specialtype_template.content = "{{#{Card::Name.joint}age}}" Card::Auth.as_bot { specialtype_template.save! } assert_equal "{{#{Card::Name.joint}age}}", specialtype_template.format.render_raw wooga = Card.create! name: "Wooga", type: "SpecialType" wooga_age = create! "#{wooga.name}#{Card::Name.joint}age", "39" expect(wooga_age.format.render_core).to eq("39") expect(wooga_age.nesters.map(&:name)).to eq(["Wooga"]) end end end