From: Lunar <lunar@anargeek.net>
Date: Sat, 1 Jun 2013 16:36:10 +0000 (+0200)
Subject: Start implementing update-ag-subscribers
X-Git-Url: https://www.nos-oignons.net/gitweb/gestion-adh.git/commitdiff_plain/4a99ae87e0f7fdd07d8820a724fbed1d8b2b5f36

Start implementing update-ag-subscribers
---

diff --git a/bin/update-ag-subscribers b/bin/update-ag-subscribers
new file mode 100755
index 0000000..e5580c2
--- /dev/null
+++ b/bin/update-ag-subscribers
@@ -0,0 +1,9 @@
+#!/usr/bin/ruby1.9.1
+#-*- coding: utf-8 -*-
+
+require 'rubygems'
+require 'bundler'
+Bundler.setup
+
+require 'nos_oignons/mailman'
+require 'nos_oignons/subscriptions'
diff --git a/features/step_definitions/commands.rb b/features/step_definitions/commands.rb
index 0aec8b6..685aa15 100644
--- a/features/step_definitions/commands.rb
+++ b/features/step_definitions/commands.rb
@@ -4,6 +4,10 @@ When /^j'exécute list\-emails$/ do
   run_simple 'list-emails'
 end
 
+When /^j'exécute update-ag-subscribers$/ do
+  run_simple 'update-ag-subscribers'
+end
+
 Then /^je ne dois pas avoir eu d'erreur$/ do
   assert_exit_status(0)
 end
diff --git a/features/step_definitions/mailman.rb b/features/step_definitions/mailman.rb
new file mode 100644
index 0000000..ab98b18
--- /dev/null
+++ b/features/step_definitions/mailman.rb
@@ -0,0 +1,35 @@
+#-*- coding: utf-8 -*-
+
+require 'json'
+
+Before('@mailman') do
+  @mock_mailman_db = "#{current_dir}/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}"
+end
+
+After('@mailman') do
+  ENV['PATH'] = @orig_path
+  FileUtils.remove_entry_secure @mock_mailman_db
+end
+
+def init_mailman_mock_db(dict)
+  File.open(@mock_mailman_db, 'w') { |f| f.write(JSON.dump(dict)) }
+end
+
+def mailman_mock_db
+  JSON.load(File.open(@mock_mailman_db))
+end
+
+Given /^une liste ag@ avec comme emails inscrits:$/ do |subscriber_list|
+  emails = subscriber_list.strip.split
+  init_mailman_mock_db('ag' => emails)
+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)
+end
+
diff --git a/features/support/mock_mailman/add_members b/features/support/mock_mailman/add_members
new file mode 100755
index 0000000..59563d8
--- /dev/null
+++ b/features/support/mock_mailman/add_members
@@ -0,0 +1,15 @@
+#!/usr/bin/ruby1.9.1
+
+require 'json'
+
+db = ENV['MOCK_MAILMAN_DB']
+
+lists = JSON.load(File.read(db))
+if ARGV[0] != '-r'
+  $stderr.puts "Bad call"
+  exit 1
+else
+  emails = (ARGV[1] == '-' ? $stdin : File.open(ARGV[1])).read.split
+  lists[ARGV[2]] = (lists[ARGV[2]] || []) + emails
+end
+File.open(db, 'w') { |f| f.write(JSON.dump(lists)) }
diff --git a/features/support/mock_mailman/list_members b/features/support/mock_mailman/list_members
new file mode 100755
index 0000000..47fbdda
--- /dev/null
+++ b/features/support/mock_mailman/list_members
@@ -0,0 +1,10 @@
+#!/usr/bin/ruby1.9.1
+
+require 'json'
+
+db = ENV['MOCK_MAILMAN_DB']
+
+lists = JSON.load(File.read(db))
+(lists[ARGV[0]] || []).each do |email|
+  puts email
+end
diff --git a/features/support/mock_mailman/remove_members b/features/support/mock_mailman/remove_members
new file mode 100755
index 0000000..b3eaffa
--- /dev/null
+++ b/features/support/mock_mailman/remove_members
@@ -0,0 +1,15 @@
+#!/usr/bin/ruby1.9.1
+
+require 'json'
+
+db = ENV['MOCK_MAILMAN_DB']
+
+lists = JSON.load(File.read(db))
+if ARGV[0] != '-f'
+  $stderr.puts "Bad call"
+  exit 1
+else
+  emails = (ARGV[1] == '-' ? $stdin : File.open(ARGV[1])).read.split
+  lists[ARGV[2]] = (lists[ARGV[2]] || []) - emails
+end
+File.open(db, 'w') { |f| f.write(JSON.dump(lists)) }
diff --git a/features/update-ag-subscribers.feature b/features/update-ag-subscribers.feature
index 7fe997d..0ca89aa 100644
--- a/features/update-ag-subscribers.feature
+++ b/features/update-ag-subscribers.feature
@@ -1,5 +1,6 @@
 # language: fr
 
+@mailman
 Fonctionnalité: mettre à jour les emails inscrites à la liste ag@
   En tant que membre de Nos oignons, mon adresse email doit être inscrite
   à la liste ag@ qui correspond à l'assemblée générale. Elle doit
diff --git a/lib/nos_oignons/mailman.rb b/lib/nos_oignons/mailman.rb
new file mode 100644
index 0000000..501b542
--- /dev/null
+++ b/lib/nos_oignons/mailman.rb
@@ -0,0 +1,22 @@
+#-*- coding: utf-8 -*-
+
+require 'shellwords'
+
+module NosOignons
+  module Mailman
+    class << self
+      def list_members(list)
+        `list_members #{Shellwords.escape(list)}`.split
+      end
+
+      def add_member(list, email)
+        add_members(list, [email])
+      end
+
+      def add_members(list, emails)
+        # XXX IO.popen 
+        `add_members #{Shellwords.escape(list)}`.split
+      end
+    end
+  end
+end