2023-12-15 15:11:14 -05:00
# frozen_string_literal: true
RSpec . describe " AI Post helper " , type : :system , js : true do
fab! ( :user ) { Fabricate ( :admin ) }
fab! ( :non_member_group ) { Fabricate ( :group ) }
2024-03-05 10:48:28 -05:00
fab! ( :topic )
fab! ( :category )
2023-12-15 15:11:14 -05:00
fab! ( :category_2 ) { Fabricate ( :category ) }
fab! ( :post ) do
Fabricate (
:post ,
topic : topic ,
raw :
" I like to eat pie. It is a very good dessert. Some people are wasteful by throwing pie at others but I do not do that. I always eat the pie. " ,
)
end
fab! ( :post_2 ) do
Fabricate (
:post ,
topic : topic ,
raw : " I prefer to eat croissants. They are my personal favorite dessert! " ,
)
end
fab! ( :post_3 ) do
Fabricate (
:post ,
topic : topic ,
raw : " I disagree with both of you, I think cake is the best dessert. " ,
)
end
let ( :topic_page ) { PageObjects :: Pages :: Topic . new }
let ( :suggestion_menu ) { PageObjects :: Components :: AiSplitTopicSuggester . new }
fab! ( :video ) { Fabricate ( :tag ) }
fab! ( :music ) { Fabricate ( :tag ) }
fab! ( :cloud ) { Fabricate ( :tag ) }
fab! ( :feedback ) { Fabricate ( :tag ) }
fab! ( :review ) { Fabricate ( :tag ) }
before do
Group . find_by ( id : Group :: AUTO_GROUPS [ :admins ] ) . add ( user )
2024-06-19 17:01:35 -04:00
assign_fake_provider_to ( :ai_helper_model )
2024-08-12 18:40:23 -04:00
SiteSetting . ai_helper_enabled = true
2023-12-15 15:11:14 -05:00
sign_in ( user )
end
def open_move_topic_modal
topic_page . visit_topic ( topic )
find ( " .topic-timeline .toggle-admin-menu " ) . click
find ( " .topic-admin-multi-select .btn " ) . click
find ( " # post_2 .select-posts .select-below " ) . click
find ( " .move-to-topic " ) . click
end
describe " moving posts to a new topic " do
context " when suggesting titles with AI title suggester " do
let ( :mode ) { CompletionPrompt :: GENERATE_TITLES }
let ( :titles ) do
" <item>Pie: A delicious dessert</item><item>Cake is the best!</item><item>Croissants are delightful</item><item>Some great desserts</item><item>What is the best dessert?</item> "
end
it " opens a menu with title suggestions " do
open_move_topic_modal
DiscourseAi :: Completions :: Llm . with_prepared_responses ( [ titles ] ) do
suggestion_menu . click_suggest_titles_button
wait_for { suggestion_menu . has_dropdown? }
expect ( suggestion_menu ) . to have_dropdown
end
end
it " replaces the title input with the selected title " do
open_move_topic_modal
DiscourseAi :: Completions :: Llm . with_prepared_responses ( [ titles ] ) do
suggestion_menu . click_suggest_titles_button
wait_for { suggestion_menu . has_dropdown? }
suggestion_menu . select_suggestion_by_value ( 1 )
expected_title = " Cake is the best! "
expect ( find ( " # split-topic-name " ) . value ) . to eq ( expected_title )
end
end
end
context " when suggesting categories with AI category suggester " do
2024-02-01 12:06:51 -05:00
before { SiteSetting . ai_embeddings_enabled = true }
2023-12-15 15:11:14 -05:00
skip " TODO: Category suggester only loading one category in test " do
it " updates the category with the suggested category " do
response =
Category
. take ( 3 )
. pluck ( :name )
. map { | s | { name : s , score : rand ( 0 . 0 ... 45 . 0 ) } }
. sort { | h | h [ :score ] }
DiscourseAi :: AiHelper :: SemanticCategorizer
. any_instance
. stubs ( :categories )
. returns ( response )
open_move_topic_modal
suggestion_menu . click_suggest_category_button
wait_for { suggestion_menu . has_dropdown? }
suggestion = category . name
suggestion_menu . select_suggestion_by_name ( suggestion )
category_selector = page . find ( " .category-chooser summary " )
expect ( category_selector [ " data-name " ] ) . to eq ( suggestion )
end
end
end
context " when suggesting tags with AI tag suggester " do
2024-02-01 12:06:51 -05:00
before { SiteSetting . ai_embeddings_enabled = true }
2023-12-15 15:11:14 -05:00
2024-01-19 06:51:26 -05:00
it " update the tag with the suggested tag " do
2023-12-15 15:11:14 -05:00
response =
Tag
. take ( 5 )
. pluck ( :name )
. map { | s | { name : s , score : rand ( 0 . 0 ... 45 . 0 ) } }
. sort { | h | h [ :score ] }
DiscourseAi :: AiHelper :: SemanticCategorizer . any_instance . stubs ( :tags ) . returns ( response )
open_move_topic_modal
suggestion_menu . click_suggest_tags_button
wait_for { suggestion_menu . has_dropdown? }
suggestion = suggestion_menu . suggestion_name ( 0 )
suggestion_menu . select_suggestion_by_value ( 0 )
tag_selector = page . find ( " .tag-chooser summary " )
expect ( tag_selector [ " data-name " ] ) . to eq ( suggestion )
end
end
end
end