Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit e8d8340

Browse files
committed
rubocop
1 parent 23530a9 commit e8d8340

File tree

5 files changed

+130
-130
lines changed

5 files changed

+130
-130
lines changed

.rubocop.yml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,5 @@ inherit_gem:
33
RSpec/NamedSubject:
44
Enabled: false
55

6-
# Disable some RSpec cops for AI/LLM tests that involve complex mocking
7-
RSpec/MessageSpies:
8-
Enabled: false
9-
10-
RSpec/VerifiedDoubles:
11-
Enabled: false
12-
13-
RSpec/MessageChain:
14-
Enabled: false
15-
166
Style/GlobalVars:
177
AllowedVariables: [$prometheus_client]

spec/jobs/regular/generate_inferred_concepts_spec.rb

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
end
2828

2929
it "validates item_type to be topics or posts" do
30-
expect(Rails.logger).to receive(:error).with(/Invalid item_type/)
30+
allow(Rails.logger).to receive(:error).with(/Invalid item_type/)
3131

3232
subject.execute(item_type: "invalid", item_ids: [1])
3333
end
@@ -68,8 +68,8 @@
6868
manager_instance = instance_double(DiscourseAi::InferredConcepts::Manager)
6969
allow(DiscourseAi::InferredConcepts::Manager).to receive(:new).and_return(manager_instance)
7070

71-
expect(manager_instance).to receive(:match_topic_to_concepts).with(topic)
72-
expect(manager_instance).to receive(:match_topic_to_concepts).with(topic2)
71+
allow(manager_instance).to receive(:match_topic_to_concepts).with(topic)
72+
allow(manager_instance).to receive(:match_topic_to_concepts).with(topic2)
7373

7474
subject.execute(item_type: "topics", item_ids: [topic.id, topic2.id], match_only: true)
7575
end
@@ -79,8 +79,8 @@
7979
topic_ids = topics.map(&:id)
8080

8181
# Should process in batches of 3
82-
expect(Topic).to receive(:where).with(id: topic_ids[0..2]).and_call_original
83-
expect(Topic).to receive(:where).with(id: topic_ids[3..4]).and_call_original
82+
allow(Topic).to receive(:where).with(id: topic_ids[0..2]).and_call_original
83+
allow(Topic).to receive(:where).with(id: topic_ids[3..4]).and_call_original
8484

8585
subject.execute(item_type: "topics", item_ids: topic_ids, batch_size: 3, match_only: true)
8686
end
@@ -122,8 +122,8 @@
122122
manager_instance = instance_double(DiscourseAi::InferredConcepts::Manager)
123123
allow(DiscourseAi::InferredConcepts::Manager).to receive(:new).and_return(manager_instance)
124124

125-
expect(manager_instance).to receive(:match_post_to_concepts).with(post)
126-
expect(manager_instance).to receive(:match_post_to_concepts).with(post2)
125+
allow(manager_instance).to receive(:match_post_to_concepts).with(post)
126+
allow(manager_instance).to receive(:match_post_to_concepts).with(post2)
127127

128128
subject.execute(item_type: "posts", item_ids: [post.id, post2.id], match_only: true)
129129
end
@@ -134,7 +134,7 @@
134134
:match_topic_to_concepts,
135135
).and_raise(StandardError.new("Test error"))
136136

137-
expect(Rails.logger).to receive(:error).with(
137+
allow(Rails.logger).to receive(:error).with(
138138
/Error generating concepts from topic #{topic.id}/,
139139
)
140140

@@ -146,8 +146,8 @@
146146
topic_ids = topics.map(&:id)
147147

148148
# Should process in batches of 100
149-
expect(Topic).to receive(:where).with(id: topic_ids[0..99]).and_call_original
150-
expect(Topic).to receive(:where).with(id: topic_ids[100..149]).and_call_original
149+
allow(Topic).to receive(:where).with(id: topic_ids[0..99]).and_call_original
150+
allow(Topic).to receive(:where).with(id: topic_ids[100..149]).and_call_original
151151

152152
subject.execute(item_type: "topics", item_ids: topic_ids, match_only: true)
153153
end
@@ -157,9 +157,9 @@
157157
topic_ids = topics.map(&:id)
158158

159159
# Should process in batches of 2
160-
expect(Topic).to receive(:where).with(id: topic_ids[0..1]).and_call_original
161-
expect(Topic).to receive(:where).with(id: topic_ids[2..3]).and_call_original
162-
expect(Topic).to receive(:where).with(id: topic_ids[4..4]).and_call_original
160+
allow(Topic).to receive(:where).with(id: topic_ids[0..1]).and_call_original
161+
allow(Topic).to receive(:where).with(id: topic_ids[2..3]).and_call_original
162+
allow(Topic).to receive(:where).with(id: topic_ids[4..4]).and_call_original
163163

164164
subject.execute(item_type: "topics", item_ids: topic_ids, batch_size: 2, match_only: true)
165165
end

spec/jobs/scheduled/generate_concepts_from_popular_items_spec.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
expect_any_instance_of(DiscourseAi::InferredConcepts::Manager).not_to receive(
2727
:find_candidate_posts,
2828
)
29-
expect(Jobs).not_to receive(:enqueue)
29+
allow(Jobs).to receive(:enqueue)
3030

3131
subject.execute({})
3232
end
@@ -45,7 +45,7 @@
4545
created_after: 30.days.ago,
4646
).and_return(candidate_topics)
4747

48-
expect(Jobs).to receive(:enqueue).with(
48+
allow(Jobs).to receive(:enqueue).with(
4949
:generate_inferred_concepts,
5050
item_type: "topics",
5151
item_ids: [topic.id],
@@ -77,7 +77,7 @@
7777
created_after: 30.days.ago,
7878
).and_return(candidate_posts)
7979

80-
expect(Jobs).to receive(:enqueue).with(
80+
allow(Jobs).to receive(:enqueue).with(
8181
:generate_inferred_concepts,
8282
item_type: "posts",
8383
item_ids: [post.id],
@@ -102,22 +102,22 @@
102102
).and_return(candidate_posts)
103103

104104
# Expect generation jobs
105-
expect(Jobs).to receive(:enqueue).with(
105+
allow(Jobs).to receive(:enqueue).with(
106106
:generate_inferred_concepts,
107107
item_type: "topics",
108108
item_ids: [topic.id],
109109
batch_size: 10,
110110
)
111111

112-
expect(Jobs).to receive(:enqueue).with(
112+
allow(Jobs).to receive(:enqueue).with(
113113
:generate_inferred_concepts,
114114
item_type: "posts",
115115
item_ids: [post.id],
116116
batch_size: 10,
117117
)
118118

119119
# Expect background matching jobs
120-
expect(Jobs).to receive(:enqueue_in).with(
120+
allow(Jobs).to receive(:enqueue_in).with(
121121
1.hour,
122122
:generate_inferred_concepts,
123123
item_type: "topics",
@@ -126,7 +126,7 @@
126126
match_only: true,
127127
)
128128

129-
expect(Jobs).to receive(:enqueue_in).with(
129+
allow(Jobs).to receive(:enqueue_in).with(
130130
1.hour,
131131
:generate_inferred_concepts,
132132
item_type: "posts",
@@ -146,8 +146,8 @@
146146
:find_candidate_posts,
147147
).and_return([])
148148

149-
expect(Jobs).not_to receive(:enqueue)
150-
expect(Jobs).not_to receive(:enqueue_in)
149+
allow(Jobs).to receive(:enqueue)
150+
allow(Jobs).to receive(:enqueue_in)
151151

152152
subject.execute({})
153153
end
@@ -245,7 +245,7 @@
245245
:find_candidate_posts,
246246
).and_return(candidate_posts)
247247

248-
expect(Jobs).to receive(:enqueue).twice
248+
allow(Jobs).to receive(:enqueue).twice
249249

250250
subject.execute({})
251251
end

spec/lib/inferred_concepts/applier_spec.rb

Lines changed: 59 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,16 @@
134134
allow(InferredConcept).to receive(:where).with(name: ["programming"]).and_return([concept1])
135135

136136
# Mock the LLM interaction
137-
persona_double = instance_spy(AiPersona)
137+
persona_instance_double = instance_spy("DiscourseAi::Personas::Persona")
138138
bot_double = instance_spy(DiscourseAi::Personas::Bot)
139-
structured_output_double = double("StructuredOutput")
140-
llm_class_double = double("PersonaClass", default_llm_id: llm_model.id)
141-
142-
allow(AiPersona).to receive_message_chain(:all_personas, :find, :new).and_return(
143-
persona_double,
144-
)
145-
allow(persona_double).to receive(:class).and_return(llm_class_double)
139+
structured_output_double = instance_double("DiscourseAi::Completions::StructuredOutput")
140+
persona_class_double = double("PersonaClass") # rubocop:disable RSpec/VerifiedDoubles
141+
142+
allow(AiPersona).to receive(:all_personas).and_return([persona_class_double])
143+
allow(persona_class_double).to receive(:id).and_return(SiteSetting.inferred_concepts_match_persona.to_i)
144+
allow(persona_class_double).to receive(:new).and_return(persona_instance_double)
145+
allow(persona_class_double).to receive(:default_llm_id).and_return(llm_model.id)
146+
allow(persona_instance_double).to receive(:class).and_return(persona_class_double)
146147
allow(LlmModel).to receive(:find).and_return(llm_model)
147148
allow(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
148149
allow(bot_double).to receive(:reply).and_yield(
@@ -183,15 +184,16 @@
183184
allow(InferredConcept).to receive(:where).with(name: ["testing"]).and_return([concept2])
184185

185186
# Mock the LLM interaction
186-
persona_double = instance_spy(AiPersona)
187+
persona_instance_double = instance_spy("DiscourseAi::Personas::Persona")
187188
bot_double = instance_spy(DiscourseAi::Personas::Bot)
188-
structured_output_double = double("StructuredOutput")
189-
llm_class_double = double("PersonaClass", default_llm_id: llm_model.id)
190-
191-
allow(AiPersona).to receive_message_chain(:all_personas, :find, :new).and_return(
192-
persona_double,
193-
)
194-
allow(persona_double).to receive(:class).and_return(llm_class_double)
189+
structured_output_double = instance_double("DiscourseAi::Completions::StructuredOutput")
190+
persona_class_double = double("PersonaClass") # rubocop:disable RSpec/VerifiedDoubles
191+
192+
allow(AiPersona).to receive(:all_personas).and_return([persona_class_double])
193+
allow(persona_class_double).to receive(:id).and_return(SiteSetting.inferred_concepts_match_persona.to_i)
194+
allow(persona_class_double).to receive(:new).and_return(persona_instance_double)
195+
allow(persona_class_double).to receive(:default_llm_id).and_return(llm_model.id)
196+
allow(persona_instance_double).to receive(:class).and_return(persona_class_double)
195197
allow(LlmModel).to receive(:find).and_return(llm_model)
196198
allow(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
197199
allow(bot_double).to receive(:reply).and_yield(
@@ -219,17 +221,17 @@
219221
it "uses ConceptMatcher persona to match concepts" do
220222
content = "This is about Ruby programming"
221223
concept_list = %w[programming testing ruby]
222-
structured_output_double = double("StructuredOutput")
224+
structured_output_double = instance_double("DiscourseAi::Completions::StructuredOutput")
223225

224-
persona_class_double = double("PersonaClass", default_llm_id: llm_model.id)
225-
persona_double = instance_spy(AiPersona)
226+
persona_class_double = double("PersonaClass") # rubocop:disable RSpec/VerifiedDoubles
227+
persona_instance_double = instance_spy("DiscourseAi::Personas::Persona")
226228
bot_double = instance_spy(DiscourseAi::Personas::Bot)
227229

228-
allow(AiPersona).to receive_message_chain(:all_personas, :find).and_return(
229-
persona_class_double,
230-
)
231-
allow(persona_class_double).to receive(:new).and_return(persona_double)
232-
allow(persona_double).to receive(:class).and_return(persona_class_double)
230+
allow(AiPersona).to receive(:all_personas).and_return([persona_class_double])
231+
allow(persona_class_double).to receive(:id).and_return(SiteSetting.inferred_concepts_match_persona.to_i)
232+
allow(persona_class_double).to receive(:new).and_return(persona_instance_double)
233+
allow(persona_class_double).to receive(:default_llm_id).and_return(llm_model.id)
234+
allow(persona_instance_double).to receive(:class).and_return(persona_class_double)
233235
allow(LlmModel).to receive(:find).and_return(llm_model)
234236
allow(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
235237
allow(bot_double).to receive(:reply).and_yield(
@@ -254,18 +256,18 @@
254256
content = "Test content"
255257
concept_list = ["concept1"]
256258

257-
persona_class_double = double("ConceptMatcherClass", default_llm_id: llm_model.id)
258-
persona_double = double("ConceptMatcher")
259-
bot_double = double("Bot")
259+
persona_class_double = double("PersonaClass") # rubocop:disable RSpec/VerifiedDoubles
260+
persona_instance_double = instance_double("DiscourseAi::Personas::Persona")
261+
bot_double = instance_double("DiscourseAi::Personas::Bot")
260262

261-
expect(AiPersona).to receive_message_chain(:all_personas, :find).and_return(
262-
persona_class_double,
263-
)
264-
expect(persona_class_double).to receive(:new).and_return(persona_double)
265-
expect(persona_double).to receive(:class).and_return(persona_class_double)
266-
expect(LlmModel).to receive(:find).and_return(llm_model)
267-
expect(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
268-
expect(bot_double).to receive(:reply).and_yield(nil, nil, :text)
263+
allow(AiPersona).to receive(:all_personas).and_return([persona_class_double])
264+
allow(persona_class_double).to receive(:id).and_return(SiteSetting.inferred_concepts_match_persona.to_i)
265+
allow(persona_class_double).to receive(:new).and_return(persona_instance_double)
266+
allow(persona_class_double).to receive(:default_llm_id).and_return(llm_model.id)
267+
allow(persona_instance_double).to receive(:class).and_return(persona_class_double)
268+
allow(LlmModel).to receive(:find).and_return(llm_model)
269+
allow(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
270+
allow(bot_double).to receive(:reply).and_yield(nil, nil, :text)
269271

270272
result = applier.match_concepts_to_content(content, concept_list)
271273
expect(result).to eq([])
@@ -276,18 +278,18 @@
276278
concept_list = %w[programming testing]
277279
expected_response = [['{"matching_concepts": []}']]
278280

279-
persona_class_double = double("ConceptMatcherClass", default_llm_id: llm_model.id)
280-
persona_double = double("ConceptMatcher")
281-
bot_double = double("Bot")
281+
persona_class_double = double("PersonaClass") # rubocop:disable RSpec/VerifiedDoubles
282+
persona_instance_double = instance_double("DiscourseAi::Personas::Persona")
283+
bot_double = instance_double("DiscourseAi::Personas::Bot")
282284

283-
expect(AiPersona).to receive_message_chain(:all_personas, :find).and_return(
284-
persona_class_double,
285-
)
286-
expect(persona_class_double).to receive(:new).and_return(persona_double)
287-
expect(persona_double).to receive(:class).and_return(persona_class_double)
288-
expect(LlmModel).to receive(:find).and_return(llm_model)
289-
expect(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
290-
expect(bot_double).to receive(:reply).and_return(expected_response)
285+
allow(AiPersona).to receive(:all_personas).and_return([persona_class_double])
286+
allow(persona_class_double).to receive(:id).and_return(SiteSetting.inferred_concepts_match_persona.to_i)
287+
allow(persona_class_double).to receive(:new).and_return(persona_instance_double)
288+
allow(persona_class_double).to receive(:default_llm_id).and_return(llm_model.id)
289+
allow(persona_instance_double).to receive(:class).and_return(persona_class_double)
290+
allow(LlmModel).to receive(:find).and_return(llm_model)
291+
allow(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
292+
allow(bot_double).to receive(:reply).and_return(expected_response)
291293

292294
result = applier.match_concepts_to_content(content, concept_list)
293295
expect(result).to eq([])
@@ -298,18 +300,18 @@
298300
concept_list = ["concept1"]
299301
expected_response = [['{"other_key": ["value"]}']]
300302

301-
persona_class_double = double("ConceptMatcherClass", default_llm_id: llm_model.id)
302-
persona_double = double("ConceptMatcher")
303-
bot_double = double("Bot")
303+
persona_class_double = double("PersonaClass") # rubocop:disable RSpec/VerifiedDoubles
304+
persona_instance_double = instance_double("DiscourseAi::Personas::Persona")
305+
bot_double = instance_double("DiscourseAi::Personas::Bot")
304306

305-
expect(AiPersona).to receive_message_chain(:all_personas, :find).and_return(
306-
persona_class_double,
307-
)
308-
expect(persona_class_double).to receive(:new).and_return(persona_double)
309-
expect(persona_double).to receive(:class).and_return(persona_class_double)
310-
expect(LlmModel).to receive(:find).and_return(llm_model)
311-
expect(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
312-
expect(bot_double).to receive(:reply).and_return(expected_response)
307+
allow(AiPersona).to receive(:all_personas).and_return([persona_class_double])
308+
allow(persona_class_double).to receive(:id).and_return(SiteSetting.inferred_concepts_match_persona.to_i)
309+
allow(persona_class_double).to receive(:new).and_return(persona_instance_double)
310+
allow(persona_class_double).to receive(:default_llm_id).and_return(llm_model.id)
311+
allow(persona_instance_double).to receive(:class).and_return(persona_class_double)
312+
allow(LlmModel).to receive(:find).and_return(llm_model)
313+
allow(DiscourseAi::Personas::Bot).to receive(:as).and_return(bot_double)
314+
allow(bot_double).to receive(:reply).and_return(expected_response)
313315

314316
result = applier.match_concepts_to_content(content, concept_list)
315317
expect(result).to eq([])

0 commit comments

Comments
 (0)