Skip to content

Commit f49cac1

Browse files
authored
Merge pull request #1188 from DaanVanVugt/bugfix/broken_scraper_check
stricter tests for broken scraper check and better query
2 parents ad29a1f + 43768fa commit f49cac1

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/models/content_provider_test.rb

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,71 @@ class ContentProviderTest < ActiveSupport::TestCase
130130
end
131131
end
132132
end
133+
134+
class ContentProvidersWithBrokenScrapersTest < ActiveSupport::TestCase
135+
setup do
136+
@cutoff = 1.week.ago
137+
@user = users(:regular_user)
138+
@provider = ContentProvider.create!(title: 'Goblet', user: @user, url: 'http://www.google.com#1')
139+
@provider_2 = ContentProvider.create!(title: 'Two', user: @user, url: 'http://www.google.com#1')
140+
@params = {title: 'my_title', description: 'my_description', url: 'http://www.google.com#1', user: @user}
141+
end
142+
143+
test "excludes providers with no events and no materials" do
144+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
145+
assert_empty result
146+
end
147+
148+
test "includes provider only with events all before cutoff" do
149+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
150+
@provider.events.create!(@params.merge({updated_at: 3.weeks.ago}))
151+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
152+
assert_includes result, @provider
153+
end
154+
155+
test "excludes provider with any event after cutoff" do
156+
@provider.events.create!(@params.merge({updated_at: 2.days.ago}))
157+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
158+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
159+
refute_includes result, @provider
160+
end
161+
162+
test "includes provider only with materials all before cutoff" do
163+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
164+
@provider.materials.create!(@params.merge({updated_at: 3.weeks.ago}))
165+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
166+
assert_includes result, @provider
167+
end
168+
169+
test "excludes provider with any material after cutoff" do
170+
@provider.materials.create!(@params.merge({updated_at: 2.days.ago}))
171+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
172+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
173+
refute_includes result, @provider
174+
end
175+
176+
test "includes provider with both events and materials all before cutoff" do
177+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
178+
@provider.events.create!(@params.merge({updated_at: 3.weeks.ago}))
179+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
180+
@provider.materials.create!(@params.merge({updated_at: 3.weeks.ago}))
181+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
182+
assert_includes result, @provider
183+
end
184+
185+
test "excludes provider with mixed cases where one event or material is too new" do
186+
@provider.events.create!(@params.merge({updated_at: 2.days.ago}))
187+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
188+
@provider.materials.create!(@params.merge({updated_at: 2.weeks.ago}))
189+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
190+
refute_includes result, @provider
191+
end
192+
193+
test "filters correctly by title" do
194+
@provider.events.create!(@params.merge({updated_at: 2.weeks.ago}))
195+
@provider_2.events.create!(@params.merge({updated_at: 2.weeks.ago}))
196+
result = ContentProvider.with_broken_scrapers(["Goblet"], @cutoff)
197+
assert_includes result, @provider
198+
refute_includes result, @provider_2
199+
end
200+
end

0 commit comments

Comments
 (0)