1+ require 'test_helper'
2+
3+ class LinkCheckerTest < ActiveSupport ::TestCase
4+
5+ setup do
6+ @link_checker = LinkChecker . new ( log : false )
7+ end
8+
9+ test 'check collection' do
10+ event = events ( :two )
11+ WebMock . stub_request ( :head , event . url ) . to_return ( status : 200 )
12+ assert_nil event . link_monitor
13+
14+ assert_no_difference ( 'LinkMonitor.count' ) do
15+ @link_checker . check ( Event . where ( id : event . id ) )
16+ end
17+
18+ assert_nil event . link_monitor
19+ end
20+
21+ test 'check passing event url' do
22+ event = events ( :two )
23+ WebMock . stub_request ( :head , event . url ) . to_return ( status : 200 )
24+ assert_nil event . link_monitor
25+
26+ assert_no_difference ( 'LinkMonitor.count' ) do
27+ @link_checker . check_record ( event )
28+ end
29+
30+ assert_nil event . link_monitor
31+ end
32+
33+ test 'check failing event url' do
34+ event = events ( :two )
35+ WebMock . stub_request ( :head , event . url ) . to_return ( status : 404 )
36+ assert_nil event . link_monitor
37+
38+ assert_difference ( 'LinkMonitor.count' , 1 ) do
39+ @link_checker . check_record ( event )
40+ end
41+
42+ assert event . link_monitor
43+ assert event . link_monitor . failed_at
44+ assert_equal 404 , event . link_monitor . code
45+ end
46+
47+ test 'check failing event url that only responds to get' do
48+ event = events ( :two )
49+ WebMock . stub_request ( :head , event . url ) . to_return ( status : 405 )
50+ WebMock . stub_request ( :get , event . url ) . to_return ( status : 200 )
51+ assert_nil event . link_monitor
52+
53+ assert_no_difference ( 'LinkMonitor.count' ) do
54+ @link_checker . check_record ( event )
55+ end
56+
57+ assert_nil event . link_monitor
58+ end
59+
60+ test 'follows redirect' do
61+ event = events ( :two )
62+ WebMock . stub_request ( :head , event . url ) . to_return ( status : 405 )
63+ WebMock . stub_request ( :get , event . url ) . to_return ( status : 302 , headers : { location : 'http://website.com' } )
64+ WebMock . stub_request ( :get , 'http://website.com' ) . to_return ( status : 404 )
65+ assert_nil event . link_monitor
66+
67+ assert_difference ( 'LinkMonitor.count' , 1 ) do
68+ @link_checker . check_record ( event )
69+ end
70+
71+ assert event . link_monitor
72+ assert event . link_monitor . failed_at
73+ assert_equal 404 , event . link_monitor . code
74+ end
75+
76+ test 'avoids redirect loop' do
77+ event = events ( :two )
78+ WebMock . stub_request ( :head , event . url ) . to_return ( status : 405 )
79+ WebMock . stub_request ( :get , event . url ) . to_return ( status : 302 , headers : { location : 'http://website.com' } )
80+ WebMock . stub_request ( :get , 'http://website.com' ) . to_return ( status : 302 , headers : { location : event . url } )
81+ assert_nil event . link_monitor
82+
83+ assert_difference ( 'LinkMonitor.count' , 1 ) do
84+ @link_checker . check_record ( event )
85+ end
86+
87+ assert event . link_monitor
88+ assert event . link_monitor . failed_at
89+ assert_equal 493 , event . link_monitor . code
90+ end
91+
92+ test 'check material with external resources' do
93+ WebMock . stub_request ( :head , 'http://myurl.com/123' ) . to_return ( status : 200 )
94+ WebMock . stub_request ( :head , 'https://tess.elixir-uk.org/' ) . to_return ( status : 200 )
95+ WebMock . stub_request ( :head , 'https://bio.tools/tool/SR-Tesseler' ) . to_return ( status : 404 )
96+ WebMock . stub_request ( :head , 'https://fairsharing.org/bsg-p123456' ) . to_return ( status : 404 )
97+ material = materials ( :material_with_external_resource )
98+
99+ assert_difference ( 'LinkMonitor.count' , 2 ) do
100+ @link_checker . check_record ( material )
101+ end
102+ end
103+
104+ end
0 commit comments