discourse-calendar/spec/lib/discourse_post_event/event_parser_spec.rb

138 lines
3.6 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# frozen_string_literal: true
require "rails_helper"
def build_post(user, raw)
Post.new(user: user, raw: raw)
end
describe DiscoursePostEvent::EventParser do
subject(:parser) { DiscoursePostEvent::EventParser }
let(:user) { Fabricate(:user) }
it "works with no event" do
events = parser.extract_events(build_post(user, "this could be a nice event"))
expect(events.length).to eq(0)
end
it "finds one event" do
events = parser.extract_events(build_post(user, '[event start="foo" end="bar"]\n[/event]'))
expect(events.length).to eq(1)
end
it "finds multiple events" do
post_event = build_post user, <<~TXT
[event start="2020"]
[/event]
[event start="2021"]
[/event]
TXT
events = parser.extract_events(post_event)
expect(events.length).to eq(2)
end
it "parses options" do
events = parser.extract_events(build_post(user, '[event start="foo" end="bar"]\n[/event]'))
expect(events[0][:start]).to eq("foo")
expect(events[0][:end]).to eq("bar")
end
it "works with escaped string" do
events =
parser.extract_events(
build_post(user, "I am going to get that fixed.\n\n[event start=\"bar\"]\n[/event]"),
)
expect(events[0][:start]).to eq("bar")
end
it "parses options where value has spaces" do
events = parser.extract_events(build_post(user, '[event start="foo" name="bar baz"]\n[/event]'))
expect(events[0][:name]).to eq("bar baz")
end
it "doesnt parse invalid options" do
events =
parser.extract_events(
build_post(
user,
"I am going to get that fixed.\n\n[event start=\"foo\" something=\"bar\"]\n[/event]",
),
)
expect(events[0][:something]).to be(nil)
events =
parser.extract_events(
build_post(user, "I am going to get that fixed.\n\n[event something=\"bar\"]\n[/event]"),
)
expect(events).to eq([])
end
it "doesnt parse an event in codeblock" do
post_event = build_post user, <<-TXT
Example event:
```
[event start=\"bar\"]\n[/event]
```
TXT
events = parser.extract_events(post_event)
expect(events).to eq([])
end
it "doesnt parse in blockquote" do
post_event = build_post user, <<-TXT
[event start="2020"][/event]
TXT
events = parser.extract_events(post_event)
expect(events).to eq([])
end
it "doesnt escape event name" do
events =
parser.extract_events(
build_post(user, '[event start="foo" name="bar <script> baz"]\n[/event]'),
)
expect(events[0][:name]).to eq("bar <script> baz")
end
it "doesn't escape urls" do
post_event = build_post user, <<~TXT
[event start="2020" url="https://example.com/?q=foo&all=true"]
[/event]
TXT
events = parser.extract_events(post_event)
expect(events[0][:url]).to eq("https://example.com/?q=foo&all=true")
end
context "with custom fields" do
before { SiteSetting.discourse_post_event_allowed_custom_fields = "foo-bar|bar" }
it "parses allowed custom fields" do
post_event = build_post user, <<~TXT
[event start="2020" fooBar="1" bar="2"]
[/event]
TXT
events = parser.extract_events(post_event)
expect(events[0][:"foo-bar"]).to eq("1")
expect(events[0][:"bar"]).to eq("2")
end
it "doesnt parse not allowed custom fields" do
post_event = build_post user, <<~TXT
[event start="2020" baz="1"]
[/event]
TXT
events = parser.extract_events(post_event)
expect(events[0][:"baz"]).to eq(nil)
end
end
end