2024-04-09 09:21:31 +08:00
# frozen_string_literal: true
describe " Topic " do
let! ( :raw ) { " this is me testing a new topic by automation " }
let! ( :title ) { " This is a new topic created by automation " }
fab! ( :category ) { Fabricate ( :category ) }
fab! ( :tag1 ) { Fabricate ( :tag ) }
fab! ( :tag2 ) { Fabricate ( :tag ) }
before { SiteSetting . discourse_automation_enabled = true }
context " when using point_in_time trigger " do
fab! ( :automation ) do
Fabricate (
:automation ,
script : DiscourseAutomation :: Scripts :: TOPIC ,
trigger : DiscourseAutomation :: Triggers :: POINT_IN_TIME ,
)
end
before do
automation . upsert_field! (
" execute_at " ,
" date_time " ,
{ value : 3 . hours . from_now } ,
target : " trigger " ,
)
automation . upsert_field! ( " title " , " text " , { value : title } , target : " script " )
automation . upsert_field! ( " body " , " post " , { value : raw } , target : " script " )
automation . upsert_field! (
" category " ,
" category " ,
{ value : category . id . to_s } ,
target : " script " ,
)
end
it " creates expected topic " do
freeze_time 6 . hours . from_now do
expect {
2024-05-07 04:12:55 +08:00
Jobs :: DiscourseAutomation :: Tracker . new . execute
2024-04-09 09:21:31 +08:00
topic = Topic . last
expect ( topic . category . id ) . to eq ( category . id )
expect ( topic . title ) . to eq ( title )
expect ( topic . posts . first . raw ) . to eq ( raw )
} . to change { Topic . count } . by ( 1 )
end
end
end
context " when using recurring trigger " do
fab! ( :automation ) do
Fabricate (
:automation ,
script : DiscourseAutomation :: Scripts :: TOPIC ,
trigger : DiscourseAutomation :: Triggers :: RECURRING ,
)
end
before do
automation . upsert_field! ( " title " , " text " , { value : title } , target : " script " )
automation . upsert_field! ( " body " , " post " , { value : raw } , target : " script " )
automation . upsert_field! (
" category " ,
" category " ,
{ value : category . id . to_s } ,
target : " script " ,
)
end
it " creates expected topic " do
expect {
automation . trigger!
topic = Topic . last
expect ( topic . category . id ) . to eq ( category . id )
expect ( topic . title ) . to eq ( title )
expect ( topic . posts . first . raw ) . to eq ( raw )
} . to change { Topic . count } . by ( 1 )
end
end
context " when using user_updated trigger " do
fab! ( :user_field_1 ) { Fabricate ( :user_field , name : " custom field 1 " ) }
fab! ( :user_field_2 ) { Fabricate ( :user_field , name : " custom field 2 " ) }
fab! ( :user ) do
user = Fabricate ( :user , trust_level : TrustLevel [ 0 ] )
user . set_user_field ( user_field_1 . id , " Answer custom 1 " )
user . set_user_field ( user_field_2 . id , " Answer custom 2 " )
user . user_profile . location = " Japan "
user . user_profile . save
user . save
user
end
fab! ( :automation ) do
automation =
Fabricate (
:automation ,
script : DiscourseAutomation :: Scripts :: TOPIC ,
trigger : DiscourseAutomation :: Triggers :: USER_UPDATED ,
)
automation . upsert_field! (
" custom_fields " ,
" custom_fields " ,
{ value : [ " custom field 1 " , " custom field 2 " ] } ,
target : " trigger " ,
)
automation . upsert_field! (
" user_profile " ,
" user_profile " ,
{ value : [ " location " ] } ,
target : " trigger " ,
)
automation
end
let! ( :user_raw_post ) do
" This is a raw test post for user custom field 1: {{custom_field_1}}, custom field 2: {{custom_field_2}} and location: {{location}} "
end
let! ( :placeholder_applied_user_raw_post ) do
" This is a raw test post for user custom field 1: #{ user . custom_fields [ " user_field_ #{ user_field_1 . id } " ] } , custom field 2: #{ user . custom_fields [ " user_field_ #{ user_field_2 . id } " ] } and location: #{ user . user_profile . location } "
end
before do
automation . upsert_field! (
" title " ,
" text " ,
{ value : " {{custom_field_1}} {{location}} this is a title " } ,
target : " script " ,
)
automation . upsert_field! ( " body " , " post " , { value : user_raw_post } , target : " script " )
automation . upsert_field! (
" category " ,
" category " ,
{ value : category . id . to_s } ,
target : " script " ,
)
automation . upsert_field! ( " tags " , " tags " , { value : %w[ feedback automation ] } , target : " script " )
end
it " creates a topic correctly " do
expect {
UserUpdater . new ( user , user ) . update ( location : " Japan " )
topic = Topic . last
expect ( topic . category . id ) . to eq ( category . id )
expect ( topic . title ) . to eq (
" #{ user . custom_fields [ " user_field_ #{ user_field_1 . id } " ] } #{ user . user_profile . location } this is a title " ,
)
expect ( topic . posts . first . raw ) . to eq ( placeholder_applied_user_raw_post )
expect ( topic . tags . pluck ( :name ) ) . to contain_exactly ( " feedback " , " automation " )
} . to change { Topic . count } . by ( 1 )
end
context " when creator is one of accepted context " do
before do
automation . upsert_field! ( " creator " , " user " , { value : " updated_user " } , target : " script " )
end
it " sets the creator to the topic creator " do
expect { UserUpdater . new ( user , user ) . update ( location : " Japan " ) } . to change {
Topic . where ( user_id : user . id ) . count
} . by ( 1 )
end
end
2024-08-23 21:17:16 +08:00
context " when creating the post fails " do
2024-11-13 08:47:39 +08:00
let ( :fake_logger ) { FakeLogger . new }
before { Rails . logger . broadcast_to ( fake_logger ) }
2024-08-23 21:17:16 +08:00
2024-11-13 08:47:39 +08:00
after { Rails . logger . stop_broadcasting_to ( fake_logger ) }
2024-08-23 21:17:16 +08:00
it " logs a warning " do
expect { UserUpdater . new ( user , user ) . update ( location : " Japan " ) } . to change {
Topic . count
} . by ( 1 )
expect { UserUpdater . new ( user , user ) . update ( location : " Japan " ) } . not_to change {
Topic . count
}
expect ( Rails . logger . warnings . first ) . to match ( / Title has already been used / )
end
end
2024-04-09 09:21:31 +08:00
end
end