]> nos-oignons.net Git - gestion-adh.git/blobdiff - features/step_definitions/mailman.rb
Switch to Mailman 3 REST API for “ag” subscriptions
[gestion-adh.git] / features / step_definitions / mailman.rb
index e201bab96bc9591f8a6f306db9a242846387702a..c3c36cf3ba59be95bc0047f7b5e1a3fb8bf87e04 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+require 'webmock'
 require 'json'
+require 'digest'
 
 Before('@mailman') do
-  @mock_mailman_db = expand_path('mock_mailman.json')
-  init_mailman_mock_db({})
-  ENV['MOCK_MAILMAN_DB'] = @mock_mailman_db
-  @orig_path = ENV['PATH']
-  ENV['PATH'] = "#{File.expand_path('../../support/mock_mailman', __FILE__)}:#{@orig_path}"
+  @ag_emails = []
+  stub_request(:any, /mailman.example.org/).
+    with(basic_auth: ['mailman_rest_user', 'mailman_rest_pass'])
+  stub_request(:get, 'https://mailman.example.org/3.0/lists/ag@nos-oignons.net/roster/member').
+    with(basic_auth: ['mailman_rest_user', 'mailman_rest_pass']).
+    to_return { |request| {body: roster_member_payload } }
 end
 
-After('@mailman') do
-  ENV['PATH'] = @orig_path
-  FileUtils.remove_entry_secure @mock_mailman_db
+def member_id_for_email(email)
+  Digest::SHA1.hexdigest(email)
 end
 
-def init_mailman_mock_db(dict)
-  File.open(@mock_mailman_db, 'w') { |f| f.write(JSON.dump(dict)) }
+def roster_member_payload
+  # This is an approximation of the actual payload from Mailman, but good enough for our needs
+  payload = {
+    "total_size": @ag_emails.count,
+    "start": 0,
+    "entries": @ag_emails.map { |email| { "email": email, "member_id": member_id_for_email(email) } },
+  }
+  payload.to_json
 end
 
-def mailman_mock_db
-  JSON.load(File.open(@mock_mailman_db))
+Given /^une liste ag@ avec comme emails inscrits:$/ do |subscriber_list|
+  @ag_emails = subscriber_list.strip.split
 end
 
-Given /^une liste ag@ avec comme emails inscrits:$/ do |subscriber_list|
-  emails = subscriber_list.strip.split
-  init_mailman_mock_db('ag' => emails)
+Then 'la liste ag@ doit avoir reçu l’inscription de {string}' do |email|
+  expect(
+    a_request(:post, "https://mailman.example.org/3.0/members").
+      with(headers: {'Content-Type': 'application/json'},
+           body: hash_including(
+             {"list_id": "ag.nos-oignons.net",
+              "subscriber": email,
+              "pre_verified": true,
+              "pre_confirmed": true,
+              "pre_approved": true,
+             }
+           ),
+          )).to have_been_made
+end
+
+Then 'la liste ag@ ne doit pas avoir reçu d’inscription' do
+  expect(
+    a_request(:post, "https://mailman.example.org/3.0/members")
+  ).not_to have_been_made
 end
 
-Then /^la liste ag@ doit avoir comme emails inscrits:$/ do |expected|
-  emails = expected.strip.split.sort
-  expect(mailman_mock_db['ag'].sort).to eql(emails)
+Then 'la liste ag@ doit avoir reçu la désinscription de {string}' do |email|
+  expect(
+    a_request(:delete, "https://mailman.example.org/3.0/members/#{member_id_for_email(email)}")
+  ).to have_been_made
 end