Skip to content

Commit 1824358

Browse files
committed
stricter tests for broken scraper check and better query
1 parent 8cfab2a commit 1824358

3 files changed

Lines changed: 80 additions & 6 deletions

File tree

app/mailers/curation_mailer.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,7 @@ def check_broken_scrapers(user, cut_off_time)
5353

5454
source_names = TeSS::Config.ingestion[:sources].filter { |s| s[:enabled] }.map { |s| s[:provider] }.uniq
5555
source_names += Source.includes(:content_provider).enabled.approved.map{ |s| s.content_provider.title}
56-
@providers = ContentProvider
57-
.left_joins(%i[events materials])
58-
.where(title: source_names)
59-
.where('events.updated_at < ?', cut_off_time)
60-
.where('materials.updated_at < ?', cut_off_time)
61-
.distinct
56+
@providers = ContentProvider.with_broken_scrapers(source_names, cut_off_time)
6257
subject = t('mailer.check_broken_scrapers.subject')
6358
mail(subject:, to: user.email) do |format|
6459
format.html

app/models/content_provider.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,15 @@ def approved_editors= values
161161
editors.each { |item| remove_editor(item) if !editors_list.include?(item) }
162162
end
163163

164+
def self.with_broken_scrapers(source_names, cut_off_time)
165+
ContentProvider
166+
.left_joins(%i[events materials])
167+
.where(title: source_names)
168+
.group("content_providers.id")
169+
.having('(COUNT(events.id) > 0 OR COUNT(materials.id) > 0)')
170+
.having('(COUNT(events.id) = 0 OR MAX(events.updated_at) < :cutoff)', cutoff: cut_off_time)
171+
.having('(COUNT(materials.id) = 0 OR MAX(materials.updated_at) < :cutoff)', cutoff: cut_off_time)
172+
.to_a
173+
.uniq
174+
end
164175
end

test/mailers/curation_mailer_test.rb

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,71 @@ class CurationMailerTest < ActionMailer::TestCase
250250
end
251251
end
252252
end
253+
254+
class ContentProvidersWithBrokenScrapersTest < ActionMailer::TestCase
255+
setup do
256+
@cutoff = 1.week.ago
257+
@user = users(:regular_user)
258+
@provider = ContentProvider.create!(title: 'Goblet', user: @user, url: 'http://www.google.com#1')
259+
@provider_2 = ContentProvider.create!(title: 'Two', user: @user, url: 'http://www.google.com#1')
260+
@params = {title: 'my_title', description: 'my_description', url: 'http://www.google.com#1', user: @user}
261+
end
262+
263+
test "excludes providers with no events and no materials" do
264+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
265+
assert_empty result
266+
end
267+
268+
test "includes provider only with events all before cutoff" do
269+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
270+
@provider.events.create!(@params.merge({updated_at: 3.weeks.ago}))
271+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
272+
assert_includes result, @provider
273+
end
274+
275+
test "excludes provider with any event after cutoff" do
276+
@provider.events.create!(@params.merge({updated_at: 2.days.ago}))
277+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
278+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
279+
refute_includes result, @provider
280+
end
281+
282+
test "includes provider only with materials all before cutoff" do
283+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
284+
@provider.materials.create!(@params.merge({updated_at: 3.weeks.ago}))
285+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
286+
assert_includes result, @provider
287+
end
288+
289+
test "excludes provider with any material after cutoff" do
290+
@provider.materials.create!(@params.merge({updated_at: 2.days.ago}))
291+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
292+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
293+
refute_includes result, @provider
294+
end
295+
296+
test "includes provider with both events and materials all before cutoff" do
297+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
298+
@provider.events.create!(@params.merge({updated_at: 3.weeks.ago}))
299+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
300+
@provider.materials.create!(@params.merge({updated_at: 3.weeks.ago}))
301+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
302+
assert_includes result, @provider
303+
end
304+
305+
test "excludes provider with mixed cases where one event or material is too new" do
306+
@provider.events.create!(@params.merge({updated_at: 2.days.ago}))
307+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
308+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
309+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
310+
refute_includes result, @provider
311+
end
312+
313+
test "filters correctly by title" do
314+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
315+
@provider_2.events.create!(@params.merge({updated_at: 2.weeks.ago}))
316+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
317+
assert_includes result, @provider
318+
refute_includes result, @provider_b
319+
end
320+
end

0 commit comments

Comments
 (0)