2015-10-11 10:41:23 +01:00
require " rails_helper "
2015-04-23 19:33:29 +02:00
describe PostsController do
let! ( :user ) { log_in }
let! ( :title ) { " Testing Poll Plugin " }
2015-08-05 12:39:38 +10:00
before do
SiteSetting . min_first_post_typing_time = 0
end
2015-04-23 19:33:29 +02:00
describe " polls " do
it " works " do
xhr :post , :create , { title : title , raw : " [poll] \n - A \n - B \n [/poll] " }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " cooked " ] ) . to match ( " data-poll- " )
expect ( json [ " polls " ] [ " poll " ] ) . to be
end
it " works on any post " do
post = Fabricate ( :post )
xhr :post , :create , { topic_id : post . topic . id , raw : " [poll] \n - A \n - B \n [/poll] " }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " cooked " ] ) . to match ( " data-poll- " )
expect ( json [ " polls " ] [ " poll " ] ) . to be
end
it " should have different options " do
xhr :post , :create , { title : title , raw : " [poll] \n - A \n - A[/poll] " }
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.default_poll_must_have_different_options " ) )
end
it " should have at least 2 options " do
xhr :post , :create , { title : title , raw : " [poll] \n - A[/poll] " }
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.default_poll_must_have_at_least_2_options " ) )
end
2015-05-01 16:44:51 +02:00
it " should have at most 'SiteSetting.poll_maximum_options' options " do
raw = " [poll] "
( SiteSetting . poll_maximum_options + 1 ) . times { | n | raw << " \n - #{ n } " }
raw << " [/poll] "
xhr :post , :create , { title : title , raw : raw }
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
2015-09-27 21:36:57 +02:00
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.default_poll_must_have_less_options " , count : SiteSetting . poll_maximum_options ) )
2015-05-01 16:44:51 +02:00
end
2015-06-01 19:28:05 +02:00
it " should have valid parameters " do
xhr :post , :create , { title : title , raw : " [poll type=multiple min=5] \n - A \n - B[/poll] " }
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.default_poll_with_multiple_choices_has_invalid_parameters " ) )
end
2015-05-11 20:09:17 +02:00
it " prevents self-xss " do
xhr :post , :create , { title : title , raw : " [poll name=<script>alert('xss')</script>] \n - A \n - B \n [/poll] " }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " cooked " ] ) . to match ( " data-poll- " )
expect ( json [ " polls " ] [ " <script>alert(xss)</script> " ] ) . to be
end
2015-05-13 17:50:25 +02:00
it " also works whe there is a link starting with '[poll' " do
xhr :post , :create , { title : title , raw : " [Polls are awesome](/foobar) \n [poll] \n - A \n - B \n [/poll] " }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " cooked " ] ) . to match ( " data-poll- " )
expect ( json [ " polls " ] ) . to be
end
2015-05-13 23:12:53 +02:00
it " prevents pollception " do
xhr :post , :create , { title : title , raw : " [poll name=1] \n - A \n [poll name=2] \n - B \n - C \n [/poll] \n - D \n [/poll] " }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " cooked " ] ) . to match ( " data-poll- " )
expect ( json [ " polls " ] [ " 1 " ] ) . to_not be
expect ( json [ " polls " ] [ " 2 " ] ) . to be
end
2015-04-23 19:33:29 +02:00
describe " edit window " do
describe " within the first 5 minutes " do
let ( :post_id ) do
2015-09-14 19:27:54 +02:00
Timecop . freeze ( 4 . minutes . ago ) do
2015-04-23 19:33:29 +02:00
xhr :post , :create , { title : title , raw : " [poll] \n - A \n - B \n [/poll] " }
:: JSON . parse ( response . body ) [ " id " ]
end
end
it " can be changed " do
xhr :put , :update , { id : post_id , post : { raw : " [poll] \n - A \n - B \n - C \n [/poll] " } }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " post " ] [ " polls " ] [ " poll " ] [ " options " ] [ 2 ] [ " html " ] ) . to eq ( " C " )
end
2015-05-06 18:52:09 +02:00
it " resets the votes " do
DiscoursePoll :: Poll . vote ( post_id , " poll " , [ " 5c24fc1df56d764b550ceae1b9319125 " ] , user . id )
xhr :put , :update , { id : post_id , post : { raw : " [poll] \n - A \n - B \n - C \n [/poll] " } }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " post " ] [ " polls_votes " ] ) . to_not be
end
2015-04-23 19:33:29 +02:00
end
describe " after the first 5 minutes " do
2015-09-14 19:27:54 +02:00
let ( :poll ) { " [poll] \n - A \n - B[/poll] " }
let ( :new_option ) { " [poll] \n - A \n - C[/poll] " }
let ( :updated ) { " before \n \n [poll] \n - A \n - B[/poll] \n \n after " }
2015-04-23 19:33:29 +02:00
let ( :post_id ) do
Timecop . freeze ( 6 . minutes . ago ) do
2015-09-14 19:27:54 +02:00
xhr :post , :create , { title : title , raw : poll }
2015-04-23 19:33:29 +02:00
:: JSON . parse ( response . body ) [ " id " ]
end
end
2015-09-25 18:54:15 +02:00
describe " with no vote " do
2015-04-23 19:33:29 +02:00
2015-09-25 18:54:15 +02:00
it " OP can change the options " do
xhr :put , :update , { id : post_id , post : { raw : new_option } }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " post " ] [ " polls " ] [ " poll " ] [ " options " ] [ 1 ] [ " html " ] ) . to eq ( " C " )
end
it " staff can change the options " do
log_in_user ( Fabricate ( :moderator ) )
xhr :put , :update , { id : post_id , post : { raw : new_option } }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " post " ] [ " polls " ] [ " poll " ] [ " options " ] [ 1 ] [ " html " ] ) . to eq ( " C " )
end
it " support changes on the post " do
xhr :put , :update , { id : post_id , post : { raw : updated } }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " post " ] [ " cooked " ] ) . to match ( " before " )
end
2015-04-23 19:33:29 +02:00
2015-09-14 19:27:54 +02:00
end
describe " with at least one vote " do
before do
DiscoursePoll :: Poll . vote ( post_id , " poll " , [ " 5c24fc1df56d764b550ceae1b9319125 " ] , user . id )
end
2015-09-25 18:54:15 +02:00
it " OP cannot change the options " do
xhr :put , :update , { id : post_id , post : { raw : new_option } }
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.op_cannot_edit_options_after_5_minutes " ) )
end
it " staff can change the options " do
log_in_user ( Fabricate ( :moderator ) )
xhr :put , :update , { id : post_id , post : { raw : new_option } }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " post " ] [ " polls " ] [ " poll " ] [ " options " ] [ 1 ] [ " html " ] ) . to eq ( " C " )
end
2015-09-14 19:27:54 +02:00
it " support changes on the post " do
xhr :put , :update , { id : post_id , post : { raw : updated } }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " post " ] [ " cooked " ] ) . to match ( " before " )
end
end
2015-04-23 19:33:29 +02:00
end
end
end
describe " named polls " do
it " should have different options " do
2015-05-07 16:40:14 +02:00
xhr :post , :create , { title : title , raw : " [poll name= " " foo " " ] \n - A \n - A[/poll] " }
2015-04-23 19:33:29 +02:00
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.named_poll_must_have_different_options " , name : " foo " ) )
end
it " should have at least 2 options " do
2015-05-07 16:40:14 +02:00
xhr :post , :create , { title : title , raw : " [poll name='foo'] \n - A[/poll] " }
2015-04-23 19:33:29 +02:00
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.named_poll_must_have_at_least_2_options " , name : " foo " ) )
end
end
describe " multiple polls " do
it " works " do
xhr :post , :create , { title : title , raw : " [poll] \n - A \n - B \n [/poll] \n [poll name=foo] \n - A \n - B \n [/poll] " }
expect ( response ) . to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " cooked " ] ) . to match ( " data-poll- " )
expect ( json [ " polls " ] [ " poll " ] ) . to be
expect ( json [ " polls " ] [ " foo " ] ) . to be
end
it " should have a name " do
xhr :post , :create , { title : title , raw : " [poll] \n - A \n - B \n [/poll] \n [poll] \n - A \n - B \n [/poll] " }
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.multiple_polls_without_name " ) )
end
it " should have unique name " do
xhr :post , :create , { title : title , raw : " [poll name=foo] \n - A \n - B \n [/poll] \n [poll name=foo] \n - A \n - B \n [/poll] " }
expect ( response ) . not_to be_success
json = :: JSON . parse ( response . body )
expect ( json [ " errors " ] [ 0 ] ) . to eq ( I18n . t ( " poll.multiple_polls_with_same_name " , name : " foo " ) )
end
end
end