FEATURE: Allow tutorials to declare prerequisite before it starts.

This commit is contained in:
Guo Xiang Tan
2017-07-13 15:12:45 +09:00
parent 79a084dd58
commit c049e18203
4 changed files with 67 additions and 27 deletions

View File

@ -74,7 +74,7 @@ module DiscourseNarrativeBot
action: :reply_to_topic_notification_level_changed action: :reply_to_topic_notification_level_changed
}, },
reply: { reply: {
next_state: :tutorial_notification_level, next_state: :tutorial_change_topic_notification_level,
action: :missing_topic_notification_level_change action: :missing_topic_notification_level_change
} }
}, },

View File

@ -19,6 +19,21 @@ module DiscourseNarrativeBot
begin begin
opts = transition opts = transition
loop do
next_state = opts[:next_state]
break if next_state == :end
next_opts = self.class::TRANSITION_TABLE.fetch(next_state)
prerequisite = next_opts[:prerequisite]
break if !prerequisite || instance_eval(&prerequisite)
[:next_state, :next_instructions].each do |key|
opts[key] = next_opts[key]
end
end
rescue InvalidTransitionError rescue InvalidTransitionError
# For given input, no transition for current state # For given input, no transition for current state
return return

View File

@ -38,6 +38,7 @@ module DiscourseNarrativeBot
}, },
tutorial_emoji: { tutorial_emoji: {
prerequisite: Proc.new { SiteSetting.enable_emoji },
next_state: :tutorial_mention, next_state: :tutorial_mention,
next_instructions: Proc.new { next_instructions: Proc.new {
I18n.t("#{I18N_KEY}.mention.instructions", I18n.t("#{I18N_KEY}.mention.instructions",

View File

@ -302,23 +302,47 @@ describe DiscourseNarrativeBot::NewUserNarrative do
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji) expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji)
end end
end end
end
it 'should create the right reply' do describe 'when emoji is disabled' do
post.update!(raw: 'https://en.wikipedia.org/wiki/ROT13') before do
SiteSetting.enable_emoji = false
end
narrative.expects(:enqueue_timeout_job).with(user) it 'should create the right reply' do
narrative.input(:reply, user, post: post) post.update!(raw: 'https://en.wikipedia.org/wiki/ROT13')
new_post = Post.last
expected_raw = <<~RAW narrative.input(:reply, user, post: post)
#{I18n.t('discourse_narrative_bot.new_user_narrative.onebox.reply', base_uri: '')} new_post = Post.last
#{I18n.t('discourse_narrative_bot.new_user_narrative.emoji.instructions', base_uri: '')} expected_raw = <<~RAW
RAW #{I18n.t('discourse_narrative_bot.new_user_narrative.onebox.reply', base_uri: '')}
expect(new_post.raw).to eq(expected_raw.chomp) #{I18n.t('discourse_narrative_bot.new_user_narrative.mention.instructions',
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji) discobot_username: discobot_user.username, base_uri: ''
)}
RAW
expect(new_post.raw).to eq(expected_raw.chomp)
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_mention)
end
end
it 'should create the right reply' do
post.update!(raw: 'https://en.wikipedia.org/wiki/ROT13')
narrative.expects(:enqueue_timeout_job).with(user)
narrative.input(:reply, user, post: post)
new_post = Post.last
expected_raw = <<~RAW
#{I18n.t('discourse_narrative_bot.new_user_narrative.onebox.reply', base_uri: '')}
#{I18n.t('discourse_narrative_bot.new_user_narrative.emoji.instructions', base_uri: '')}
RAW
expect(new_post.raw).to eq(expected_raw.chomp)
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_emoji)
end
end end
end end
@ -585,25 +609,25 @@ describe DiscourseNarrativeBot::NewUserNarrative do
expect(new_post.raw).to include("/forum/images") expect(new_post.raw).to include("/forum/images")
end end
end end
end
it 'should create the right reply' do it 'should create the right reply' do
post.update!( post.update!(
raw: '[quote="#{post.user}, post:#{post.post_number}, topic:#{topic.id}"]\n:monkey: :fries:\n[/quote]' raw: '[quote="#{post.user}, post:#{post.post_number}, topic:#{topic.id}"]\n:monkey: :fries:\n[/quote]'
) )
narrative.expects(:enqueue_timeout_job).with(user) narrative.expects(:enqueue_timeout_job).with(user)
narrative.input(:reply, user, post: post) narrative.input(:reply, user, post: post)
new_post = Post.last new_post = Post.last
expected_raw = <<~RAW expected_raw = <<~RAW
#{I18n.t('discourse_narrative_bot.new_user_narrative.quoting.reply', base_uri: '')} #{I18n.t('discourse_narrative_bot.new_user_narrative.quoting.reply', base_uri: '')}
#{I18n.t('discourse_narrative_bot.new_user_narrative.images.instructions', base_uri: '')} #{I18n.t('discourse_narrative_bot.new_user_narrative.images.instructions', base_uri: '')}
RAW RAW
expect(new_post.raw).to eq(expected_raw.chomp) expect(new_post.raw).to eq(expected_raw.chomp)
expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_images) expect(narrative.get_data(user)[:state].to_sym).to eq(:tutorial_images)
end
end end
end end