#-*- coding: utf-8 -*-
#
# Système de gestion des adhésions de Nos oignons
# Copyright © 2013-2014 Nos oignons <contact@nos-oignons.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# 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
  @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

def member_id_for_email(email)
  Digest::SHA1.hexdigest(email)
end

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

Given /^une liste ag@ avec comme emails inscrits:$/ do |subscriber_list|
  @ag_emails = subscriber_list.strip.split
end

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 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

