2021-04-16 10:07:32 +02:00
# frozen_string_literal: true
2020-10-20 01:15:03 +02:00
2020-04-11 08:22:12 +02:00
describe CustomWizard :: Action do
2020-10-20 01:15:03 +02:00
fab! ( :user ) { Fabricate ( :user , name : " Angus " , username : 'angus' , email : " angus@email.com " , trust_level : TrustLevel [ 2 ] ) }
2023-04-06 18:04:01 +02:00
fab! ( :user1 ) { Fabricate ( :user , name : " Angus One " , username : 'angus1' , email : " angus_one@email.com " , trust_level : TrustLevel [ 2 ] ) }
2020-10-20 01:15:03 +02:00
fab! ( :category ) { Fabricate ( :category , name : 'cat1' , slug : 'cat-slug' ) }
2022-12-23 17:28:09 +01:00
fab! ( :tag ) { Fabricate ( :tag , name : 'tag1' ) }
2020-10-20 01:15:03 +02:00
fab! ( :group ) { Fabricate ( :group ) }
2021-03-11 07:30:15 +01:00
2021-09-07 14:06:13 +02:00
let ( :wizard_template ) { get_wizard_fixture ( " wizard " ) }
let ( :open_composer ) { get_wizard_fixture ( " actions/open_composer " ) }
let ( :create_category ) { get_wizard_fixture ( " actions/create_category " ) }
2022-03-25 17:08:24 +01:00
let ( :watch_categories ) { get_wizard_fixture ( " actions/watch_categories " ) }
2022-12-23 17:28:09 +01:00
let ( :watch_tags ) { get_wizard_fixture ( " actions/watch_tags " ) }
2021-09-07 14:06:13 +02:00
let ( :create_group ) { get_wizard_fixture ( " actions/create_group " ) }
2023-04-11 10:59:22 +02:00
let ( :existentcreate_group_with_nonexistent_user ) { get_wizard_fixture ( " actions/create_group_bad_user " ) }
2021-09-07 14:06:13 +02:00
let ( :add_to_group ) { get_wizard_fixture ( " actions/add_to_group " ) }
let ( :send_message ) { get_wizard_fixture ( " actions/send_message " ) }
let ( :send_message_multi ) { get_wizard_fixture ( " actions/send_message_multi " ) }
2021-10-05 11:07:20 +02:00
let ( :api_test_endpoint ) { get_wizard_fixture ( " endpoints/test_endpoint " ) }
2021-10-22 20:04:37 +02:00
let ( :api_test_endpoint_body ) { get_wizard_fixture ( " endpoints/test_endpoint_body " ) }
let ( :api_test_no_authorization ) { get_wizard_fixture ( " api/no_authorization " ) }
2023-02-07 12:46:17 +01:00
let ( :guests_permitted ) { get_wizard_fixture ( " wizard/guests_permitted " ) }
2021-09-07 14:06:13 +02:00
def update_template ( template )
CustomWizard :: Template . save ( template , skip_jobs : true )
@template = CustomWizard :: Template . find ( 'super_mega_fun_wizard' )
end
2021-03-11 07:30:15 +01:00
2022-09-02 09:45:20 +02:00
let ( :create_topic ) {
JSON . parse (
File . open (
" #{ Rails . root } /plugins/discourse-custom-wizard/spec/fixtures/actions/create_topic.json "
) . read
)
}
let ( :custom_field_json ) {
JSON . parse ( File . open (
" #{ Rails . root } /plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json "
) . read )
}
2020-10-20 01:15:03 +02:00
before do
Group . refresh_automatic_group! ( :trust_level_2 )
2021-09-07 14:06:13 +02:00
update_template ( wizard_template )
2020-10-20 01:15:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
context 'creating a topic' do
it " works " do
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater (
wizard . steps . first . id ,
step_1_field_1 : " Topic Title " ,
step_1_field_2 : " topic body "
) . update
wizard . create_updater ( wizard . steps . second . id , { } ) . update
wizard . create_updater ( wizard . steps . last . id ,
step_3_field_3 : category . id
) . update
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
topic = Topic . where (
title : " Topic Title " ,
category_id : category . id
)
expect ( topic . exists? ) . to eq ( true )
expect ( Post . where (
topic_id : topic . pluck ( :id ) ,
raw : " topic body "
) . exists? ) . to eq ( true )
end
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
it " fails silently without basic topic inputs " do
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater (
wizard . steps . first . id ,
step_1_field_2 : " topic body "
) . update
wizard . create_updater ( wizard . steps . second . id , { } ) . update
updater = wizard . create_updater ( wizard . steps . last . id , { } )
updater . update
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
expect ( updater . success? ) . to eq ( true )
2023-01-18 19:53:36 +01:00
expect ( CustomWizard :: UserHistory . where (
actor_id : user . id ,
2020-11-03 01:24:20 +01:00
context : " super_mega_fun_wizard " ,
subject : " step_3 "
) . exists? ) . to eq ( true )
expect ( Post . where (
raw : " topic body "
) . exists? ) . to eq ( false )
end
2021-06-08 13:39:49 +02:00
it " adds custom fields " do
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps . first . id ,
step_1_field_1 : " Topic Title " ,
step_1_field_2 : " topic body "
) . update
wizard . create_updater ( wizard . steps . second . id , { } ) . update
wizard . create_updater ( wizard . steps . last . id ,
step_3_field_3 : category . id
) . update
topic = Topic . where (
title : " Topic Title " ,
category_id : category . id
) . first
topic_custom_field = TopicCustomField . where (
name : " topic_field " ,
value : " Topic custom field value " ,
topic_id : topic . id
)
topic_json_custom_field = TopicCustomField . where ( "
name = 'topic_json_field' AND
( value :: json - >> 'key_1' ) = 'Key 1 value' AND
( value :: json - >> 'key_2' ) = 'Key 2 value' AND
topic_id = #{topic.id}"
)
post_custom_field = PostCustomField . where (
name : " post_field " ,
value : " Post custom field value " ,
post_id : topic . first_post . id
)
expect ( topic_custom_field . exists? ) . to eq ( true )
expect ( topic_json_custom_field . exists? ) . to eq ( true )
expect ( post_custom_field . exists? ) . to eq ( true )
end
2022-09-02 09:45:20 +02:00
it " adds registered custom fields " do
custom_field = custom_field_json [ 'custom_fields' ] [ 0 ]
custom_field_name = custom_field [ " name " ]
custom_field_value = " Custom value "
CustomWizard :: CustomField . new ( nil , custom_field ) . save
create_topic [ " custom_fields " ] = [
{
" type " : " association " ,
" pairs " : [
{
" index " : 0 ,
" key " : custom_field_name ,
" key_type " : " custom_field " ,
" value " : custom_field_value ,
" value_type " : " text " ,
" connector " : " association "
}
]
}
]
wizard = CustomWizard :: Wizard . new ( @template , user )
action = CustomWizard :: Action . new (
wizard : wizard ,
action : create_topic . with_indifferent_access ,
submission : wizard . current_submission
)
action . perform
expect ( action . result . success? ) . to eq ( true )
expect ( TopicCustomField . exists? ( name : custom_field_name , value : custom_field_value ) ) . to eq ( true )
end
2020-04-11 08:22:12 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-11 08:22:12 +02:00
it 'updates a profile' do
2020-10-31 08:05:50 +01:00
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
2020-10-20 01:15:03 +02:00
upload = Upload . create! (
url : '/images/image.png' ,
original_filename : 'image.png' ,
filesize : 100 ,
user_id : - 1 ,
)
2020-10-31 08:05:50 +01:00
steps = wizard . steps
wizard . create_updater ( steps [ 0 ] . id , { } ) . update
wizard . create_updater ( steps [ 1 ] . id ,
step_2_field_7 : upload . as_json
2020-10-20 01:15:03 +02:00
) . update
expect ( user . profile_background_upload . id ) . to eq ( upload . id )
2020-04-11 08:22:12 +02:00
end
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
context " open composer " do
it 'works' do
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , step_1_field_1 : " Text input " ) . update
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
updater = wizard . create_updater ( wizard . steps [ 1 ] . id , { } )
updater . update
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
expect ( updater . result [ :redirect_on_next ] ) . to eq (
2021-09-07 14:06:13 +02:00
" /new-topic?title=Title%20of%20the%20composer%20topic&body=I%20am%20interpolating%20some%20user%20fields%20Angus%20angus%20angus%40email.com&tags=tag1 "
2020-12-19 00:16:12 +01:00
)
end
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
it 'encodes special characters in the title and body' do
2021-04-16 10:07:32 +02:00
open_composer [ 'title' ] [ 0 ] [ 'output' ] = " Title that's special $ " . dup
open_composer [ 'post_template' ] = " Body & more body & more body " . dup
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
wizard = CustomWizard :: Wizard . new ( @template , user )
action = CustomWizard :: Action . new (
wizard : wizard ,
action : open_composer ,
2021-06-23 08:13:58 +02:00
submission : wizard . current_submission
2020-12-19 00:16:12 +01:00
)
action . perform
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
expect ( action . result . success? ) . to eq ( true )
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
decoded_output = CGI . parse ( URI . parse ( action . result . output ) . query )
2021-03-11 07:30:15 +01:00
2020-12-19 00:16:12 +01:00
expect ( decoded_output [ 'title' ] [ 0 ] ) . to eq ( " Title that's special $ " )
expect ( decoded_output [ 'body' ] [ 0 ] ) . to eq ( " Body & more body & more body " )
end
2020-04-11 08:22:12 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-11 08:22:12 +02:00
it 're-routes a user' do
2020-10-31 08:05:50 +01:00
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
updater = wizard . create_updater ( wizard . steps . last . id , { } )
2020-10-20 01:15:03 +02:00
updater . update
2021-04-20 19:58:19 +02:00
expect ( updater . result [ :redirect_on_next ] ) . to eq ( " https://google.com " )
2020-04-11 08:22:12 +02:00
end
2021-09-07 14:06:13 +02:00
2022-03-25 17:08:24 +01:00
context " standard subscription actions " do
2021-09-07 14:06:13 +02:00
before do
2021-11-09 15:57:33 +01:00
enable_subscription ( " standard " )
2021-09-07 14:06:13 +02:00
end
2021-09-07 14:11:50 +02:00
2022-12-23 17:28:09 +01:00
it 'watches tags' do
watch_tags [ :tags ] [ 0 ] [ :output ] = tag . name
wizard_template [ :actions ] << watch_tags
update_template ( wizard_template )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , step_1_field_1 : " Text input " ) . update
expect ( TagUser . where (
tag_id : tag . id ,
user_id : user . id
) . first . notification_level ) . to eq ( 2 )
end
2022-03-25 17:08:24 +01:00
it 'watches categories' do
watch_categories [ :categories ] [ 0 ] [ :output ] = category . id
wizard_template [ :actions ] << watch_categories
update_template ( wizard_template )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , step_1_field_1 : " Text input " ) . update
expect ( CategoryUser . where (
category_id : category . id ,
user_id : user . id
) . first . notification_level ) . to eq ( 2 )
end
2021-09-07 14:06:13 +02:00
it '#send_message' do
wizard_template [ 'actions' ] << send_message
update_template ( wizard_template )
User . create ( username : 'angus1' , email : " angus1@email.com " )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , { } ) . update
wizard . create_updater ( wizard . steps [ 1 ] . id , { } ) . update
topic = Topic . where (
archetype : Archetype . private_message ,
title : " Message title "
)
post = Post . where (
topic_id : topic . pluck ( :id ) ,
raw : " I will interpolate some wizard fields "
)
expect ( topic . exists? ) . to eq ( true )
expect ( topic . first . topic_allowed_users . first . user . username ) . to eq ( 'angus1' )
expect ( post . exists? ) . to eq ( true )
end
it '#send_message allows using multiple targets' do
wizard_template [ 'actions' ] << send_message_multi
update_template ( wizard_template )
User . create ( username : 'angus1' , email : " angus1@email.com " )
User . create ( username : 'faiz' , email : " faiz@email.com " )
Group . create ( name : " cool_group " )
Group . create ( name : 'cool_group_1' )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , { } ) . update
wizard . create_updater ( wizard . steps [ 1 ] . id , { } ) . update
topic = Topic . where (
archetype : Archetype . private_message ,
title : " Multiple Recipients title "
)
post = Post . where (
topic_id : topic . pluck ( :id ) ,
raw : " I will interpolate some wizard fields "
)
expect ( topic . exists? ) . to eq ( true )
expect ( topic . first . all_allowed_users . map ( & :username ) ) . to include ( 'angus1' , 'faiz' )
expect ( topic . first . allowed_groups . map ( & :name ) ) . to include ( 'cool_group' , 'cool_group_1' )
expect ( post . exists? ) . to eq ( true )
end
2023-01-18 19:53:36 +01:00
2023-02-07 12:46:17 +01:00
it " send_message works with guests are permitted " do
wizard_template [ " permitted " ] = guests_permitted [ " permitted " ]
2023-01-18 19:53:36 +01:00
wizard_template . delete ( " actions " )
wizard_template [ 'actions' ] = [ send_message ]
update_template ( wizard_template )
User . create ( username : 'angus1' , email : " angus1@email.com " )
wizard = CustomWizard :: Builder . new ( wizard_template [ " id " ] , nil , CustomWizard :: Wizard . generate_guest_id ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , { } ) . update
updater = wizard . create_updater ( wizard . steps [ 1 ] . id , { } )
updater . update
topic = Topic . where ( archetype : Archetype . private_message , title : " Message title " )
post = Post . where ( topic_id : topic . pluck ( :id ) )
expect ( topic . exists? ) . to eq ( true )
expect ( topic . first . topic_allowed_users . first . user . username ) . to eq ( 'angus1' )
expect ( topic . first . topic_allowed_users . second . user . username ) . to eq ( Discourse . system_user . username )
expect ( post . exists? ) . to eq ( true )
end
2022-03-25 17:08:24 +01:00
end
context " business subscription actions " do
before do
enable_subscription ( " business " )
end
2021-09-07 14:06:13 +02:00
it '#create_category' do
wizard_template [ 'actions' ] << create_category
2022-03-25 17:08:24 +01:00
wizard_template [ 'actions' ] << create_group
2021-09-07 14:06:13 +02:00
update_template ( wizard_template )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , step_1_field_1 : " Text input " ) . update
wizard . create_updater ( wizard . steps [ 1 ] . id , { } ) . update
expect ( Category . where ( id : wizard . current_submission . fields [ 'action_8' ] ) . exists? ) . to eq ( true )
end
it '#create_group' do
wizard_template [ 'actions' ] << create_group
update_template ( wizard_template )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , step_1_field_1 : " Text input " ) . update
2023-04-06 18:04:01 +02:00
group_id = Group . where ( name : wizard . current_submission . fields [ 'action_9' ] ) . first . id
user_id = User . find_by ( username : wizard_template [ 'actions' ] [ 4 ] [ 'usernames' ] [ 0 ] [ " output " ] [ 0 ] ) . id
2021-09-07 14:06:13 +02:00
expect ( Group . where ( name : wizard . current_submission . fields [ 'action_9' ] ) . exists? ) . to eq ( true )
2023-04-06 18:04:01 +02:00
expect ( GroupUser . where ( group_id : group_id , user_id : user_id ) . exists? ) . to eq ( true )
2021-09-07 14:06:13 +02:00
end
2023-04-11 10:54:37 +02:00
it '#create_group completes successfully when user included in usernames does not exist but excludes users who do not exist and includes warning in log' do
2023-04-11 10:59:22 +02:00
wizard_template [ 'actions' ] << existentcreate_group_with_nonexistent_user
2023-04-11 10:54:37 +02:00
update_template ( wizard_template )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
wizard . create_updater ( wizard . steps [ 0 ] . id , step_1_field_1 : " Text input " ) . update
group_id = Group . where ( name : wizard . current_submission . fields [ 'action_9' ] ) . first . id
expect ( CustomWizard :: Log . list_query . all . last . value . include? " some users were not found " ) . to eq ( true )
expect ( Group . where ( name : wizard . current_submission . fields [ 'action_9' ] ) . exists? ) . to eq ( true )
expect ( GroupUser . where ( group_id : group_id ) . count ) . to eq ( 1 )
end
2021-09-07 14:06:13 +02:00
it '#add_to_group' do
wizard_template [ 'actions' ] << create_group
wizard_template [ 'actions' ] << add_to_group
update_template ( wizard_template )
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
step_id = wizard . steps [ 0 ] . id
updater = wizard . create_updater ( step_id , step_1_field_1 : " Text input " ) . update
group = Group . find_by ( name : wizard . current_submission . fields [ 'action_9' ] )
expect ( group . users . first . username ) . to eq ( 'angus' )
end
2021-10-05 11:07:20 +02:00
2021-10-12 15:49:09 +02:00
it '#send_to_api successful' do
2021-10-05 11:07:20 +02:00
stub_request ( :put , " https://myexternalapi.com/update " ) .
2021-10-22 20:04:37 +02:00
with (
2021-10-05 11:07:20 +02:00
body : " some_body " ,
headers : {
2021-10-22 20:04:37 +02:00
'Host' = > 'myexternalapi.com'
2021-10-05 11:07:20 +02:00
} ) .
2021-10-22 20:04:37 +02:00
to_return ( status : 200 , body : " success " , headers : { } )
2021-10-05 11:07:20 +02:00
new_api = CustomWizard :: Api . new ( " my_api " )
CustomWizard :: Api . set ( " my_api " , title : " Mocked external api " )
CustomWizard :: Api :: Authorization . set ( " my_api " , api_test_no_authorization )
CustomWizard :: Api :: Endpoint . new ( " my_api " )
CustomWizard :: Api :: Endpoint . set ( " my_api " , api_test_endpoint )
endpoint_id = CustomWizard :: Api :: Endpoint . list ( " my_api " ) . first . id
result = CustomWizard :: Api :: Endpoint . request ( " my_api " , endpoint_id , " some_body " )
log_entry = CustomWizard :: Api :: LogEntry . list ( " my_api " ) . first
2021-10-05 11:19:47 +02:00
2021-10-05 11:07:20 +02:00
expect ( result ) . to eq ( 'success' )
expect ( log_entry . status ) . to eq ( 'SUCCESS' )
end
2021-10-12 15:49:09 +02:00
it '#send_to_api failure' do
stub_request ( :put , " https://myexternalapi.com/update " ) .
2021-10-22 20:04:37 +02:00
with (
2021-10-12 15:49:09 +02:00
body : " some_body " ,
headers : {
2021-10-22 20:04:37 +02:00
'Host' = > 'myexternalapi.com'
2021-10-12 15:49:09 +02:00
} ) .
2021-10-22 20:04:37 +02:00
to_return ( status : 500 , body : " failure " , headers : { } )
2021-10-12 15:49:09 +02:00
new_api = CustomWizard :: Api . new ( " my_api " )
CustomWizard :: Api . set ( " my_api " , title : " Mocked external api " )
CustomWizard :: Api :: Authorization . set ( " my_api " , api_test_no_authorization )
CustomWizard :: Api :: Endpoint . new ( " my_api " )
CustomWizard :: Api :: Endpoint . set ( " my_api " , api_test_endpoint )
endpoint_id = CustomWizard :: Api :: Endpoint . list ( " my_api " ) . first . id
result = CustomWizard :: Api :: Endpoint . request ( " my_api " , endpoint_id , " some_body " )
log_entry = CustomWizard :: Api :: LogEntry . list ( " my_api " ) . first
2021-10-22 20:04:37 +02:00
expect ( result ) . to eq ( { error : " API request failed " } )
2021-10-27 15:02:21 +02:00
expect ( log_entry . status ) . to eq ( 'FAIL' )
2021-10-12 15:49:09 +02:00
end
2021-09-07 14:06:13 +02:00
end
2022-09-23 17:00:41 +02:00
it 'registers callbacks' do
described_class . register_callback ( :before_create_topic ) do | params , wizard , action , submission |
params [ :topic_opts ] [ :custom_fields ] [ " topic_custom_field " ] = true
params
end
2022-09-23 17:06:16 +02:00
wizard = CustomWizard :: Builder . new ( @template [ :id ] , user ) . build
2022-09-23 17:00:41 +02:00
action = CustomWizard :: Action . new (
wizard : wizard ,
action : create_topic . with_indifferent_access ,
submission : wizard . current_submission
)
action . perform
expect ( action . result . success? ) . to eq ( true )
expect ( Topic . find ( action . result . output ) . custom_fields [ " topic_custom_field " ] ) . to eq ( " t " )
end
2020-04-11 08:22:12 +02:00
end