# 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