1+ # frozen_string_literal: true
2+
3+ require "test_helper"
4+
5+ class DomainListUpdaterTest < Minitest ::Test
6+ def setup
7+ Nondisposable . configuration = Nondisposable ::Configuration . new
8+ Nondisposable ::DisposableDomain . delete_all
9+ end
10+
11+ def test_successfully_updates_domains_from_remote
12+ body = "temp.com\n trash.net\n "
13+ stub = stub_request ( :get , %r{raw\. githubusercontent\. com/.*/disposable_email_blocklist\. conf} ) . to_return ( status : 200 , body : body )
14+
15+ assert Nondisposable ::DomainListUpdater . update
16+ assert_requested stub
17+ names = Nondisposable ::DisposableDomain . order ( :name ) . pluck ( :name )
18+ assert_equal %w[ temp.com trash.net ] , names
19+ end
20+
21+ def test_merges_additional_and_excluded_domains
22+ Nondisposable . configuration . additional_domains = [ "extra.com" , "trash.net" ]
23+ Nondisposable . configuration . excluded_domains = [ "trash.net" ]
24+
25+ body = "temp.com\n trash.net\n "
26+ stub_request ( :get , /disposable-email-domains/ ) . to_return ( status : 200 , body : body )
27+
28+ assert Nondisposable ::DomainListUpdater . update
29+ names = Nondisposable ::DisposableDomain . order ( :name ) . pluck ( :name )
30+ assert_equal %w[ extra.com temp.com ] , names
31+ end
32+
33+ def test_returns_false_on_http_failure
34+ stub_request ( :get , /disposable-email-domains/ ) . to_return ( status : 500 , body : "" )
35+
36+ refute Nondisposable ::DomainListUpdater . update
37+ assert_equal 0 , Nondisposable ::DisposableDomain . count
38+ end
39+
40+ def test_returns_false_on_empty_list
41+ stub_request ( :get , /disposable-email-domains/ ) . to_return ( status : 200 , body : "\n \n " )
42+
43+ refute Nondisposable ::DomainListUpdater . update
44+ assert_equal 0 , Nondisposable ::DisposableDomain . count
45+ end
46+
47+ def test_returns_false_on_network_error
48+ stub_request ( :get , /disposable-email-domains/ ) . to_raise ( SocketError . new ( "no network" ) )
49+
50+ refute Nondisposable ::DomainListUpdater . update
51+ assert_equal 0 , Nondisposable ::DisposableDomain . count
52+ end
53+
54+ def test_transactionality_deletes_then_inserts
55+ body = "a.com\n b.com\n "
56+ stub_request ( :get , /disposable-email-domains/ ) . to_return ( status : 200 , body : body )
57+
58+ Nondisposable ::DisposableDomain . create! ( name : "old.com" )
59+ assert Nondisposable ::DomainListUpdater . update
60+ refute Nondisposable ::DisposableDomain . exists? ( name : "old.com" )
61+ assert_equal %w[ a.com b.com ] , Nondisposable ::DisposableDomain . order ( :name ) . pluck ( :name )
62+ end
63+
64+ def test_update_rolls_back_on_insert_error
65+ # Pre-populate with a domain that should remain if the transaction rolls back
66+ Nondisposable ::DisposableDomain . create! ( name : "keep.com" )
67+
68+ body = "a.com\n "
69+ stub_request ( :get , /disposable-email-domains/ ) . to_return ( status : 200 , body : body )
70+
71+ Nondisposable ::DisposableDomain . stub ( :create , proc { raise "insert failed" } ) do
72+ refute Nondisposable ::DomainListUpdater . update
73+ end
74+
75+ # Ensure rollback kept the original data
76+ assert_equal %w[ keep.com ] , Nondisposable ::DisposableDomain . order ( :name ) . pluck ( :name )
77+ end
78+ end
0 commit comments