+require 'common/configuration'
+require 'fileutils'
+require 'minitest/unit'
+require 'pg'
+
+class MailshearsTest < MiniTest::Unit::TestCase
+ # This is that class that most (if not all) of our test cases will
+ # inherit. It provides the automatic setup and teardown of the
+ # filesystem and database that the test cases will exercise.
+
+ def configuration()
+ # Return the test config object.
+ return Configuration.new('test/mailshears.test.conf.yml')
+ end
+
+ def maildir_exists(dir)
+ # Check if the given mail directory of the form "example.com/user"
+ # exists.
+ cfg = configuration()
+ mail_root = cfg.send('mail_root')
+ return File.directory?("#{mail_root}/#{dir}")
+ end
+
+ def connect_superuser()
+ # Connect to the database (specified in the test configuration) as
+ # the superuser. Your local configuration is expected to be such
+ # that this "just works."
+ db_host = 'localhost'
+ db_port = 5432
+ db_opts = nil
+ db_tty = nil
+ db_name = 'postgres'
+ db_user = 'postgres'
+ db_pass = nil
+
+ connection = PGconn.connect(db_host,
+ db_port,
+ db_opts,
+ db_tty,
+ db_name,
+ db_user,
+ db_pass)
+
+ return connection
+ end
+
+ def setup
+ # Connect to the database specified in the test configutation as
+ # the super user. Then, run all of the SQL scripts contained in
+ # test/sql. These scripts create the tables for the plugins listed
+ # in the test configuration, and then create some sample data.
+ #
+ # Here is the full list of what gets created. Every test case
+ # inheriting from this class can expect this schema and data to
+ # exist. The filesystem entries are located beneath mail_root from
+ # the configuration file.
+ #
+ # == Filesystem ==
+ #
+ # * example.com/alice
+ # * example.com/booger
+ # * example.com/jeremy
+ # * example.net/adam
+ #
+ # == Databases ==
+ #
+ # 1. agendav_test
+ #
+ # +----------------------------+
+ # | prefs |
+ # +------------------+---------+
+ # | username | options |
+ # +------------------+---------+
+ # | adam@example.net | herp |
+ # +------------------+---------+
+ #
+ #
+ # +------------------------------------------------------+
+ # | shared |
+ # +-----+------------------+----------+------------------+
+ # | sid | user_from | calendar | user_which |
+ # +-----+------------------+----------+------------------+
+ # | 1 | adam@example.net | derp | beth@example.net |
+ # +-----+------------------+----------+------------------+
+ #
+ #
+ # 2. davical_test
+ #
+ # +-------------------------------------------------------+
+ # | usr |
+ # +---------+--------+----------------+-------------------+
+ # | user_no | active | joined | username |
+ # +---------+--------+----------------+-------------------+
+ # | 17 | t | 2014-01-04 ... | alice@example.com |
+ # +---------+--------+----------------+-------------------+
+ #
+ #
+ # +-----------------------------------------+
+ # | usr_setting |
+ # +---------+--------------+----------------+
+ # | user_no | setting_name | setting_value |
+ # +---------+--------------+----------------+
+ # | 17 | dumb setting | its dumb value |
+ # +---------+--------------+----------------+
+ #
+ #
+ # 3. postfixadmin_test
+ #
+ # +-------------+
+ # | domain |
+ # +-------------+
+ # | domain |
+ # +-------------+
+ # | ALL |
+ # +-------------+
+ # | example.com |
+ # +-------------+
+ # | example.net |
+ # +-------------+
+ #
+ #
+ # +----------------------------------------------+
+ # | mailbox |
+ # +-------------------+-------------+------------+
+ # | username | domain | local_part |
+ # +-------------------+-------------+------------+
+ # | alice@example.com | example.com | alice |
+ # +-------------------+-------------+------------+
+ # | bob@example.com | example.com | bob |
+ # +-------------------+-------------+------------+
+ # | adam@example.net | example.net | adam |
+ # +-------------------+-------------+------------+
+ # | beth@example.net | example.net | beth |
+ # +-------------------+-------------+------------+
+ # | carol@example.net | example.net | carol |
+ # +-------------------+-------------+------------+
+ #
+ #
+ # +------------------------------------------------------+
+ # | alias |
+ # +-------------------+-------------------+--------------+
+ # | address | goto | domain |
+ # +-------------------+-------------------+--------------+
+ # | alice@example.com | alice@example.com | example.com |
+ # +-------------------+-------------------+--------------+
+ # | bob@example.com | bob@example.com | example.com |
+ # +-------------------+-------------------+--------------+
+ # | adam@example.net | adam@example.net | example.net |
+ # +-------------------+-------------------+--------------+
+ # | beth@example.net | beth@example.net | example.net |
+ # +-------------------+-------------------+--------------+
+ # | carol@example.net | carol@example.net | example.net |
+ # +-------------------+-------------------+--------------+
+ #
+ #
+ # +---------------------------------+
+ # | domain_admins |
+ # +-------------------+-------------+
+ # | username | domain |
+ # +-------------------+-------------+
+ # | admin@example.com | example.com |
+ # +-------------------+-------------+
+ # | admin@example.com | example.net |
+ # +-------------------+-------------+
+ #
+ # 4. roundcube_test
+ #
+ #
+ # +---------+-------------------+
+ # | user_id | username |
+ # +---------+-------------------+
+ # | 1 | alice@example.com |
+ # +---------+-------------------+
+ # | 2 | adam@example.net |
+ # +---------+-------------------+
+
+ cfg = configuration()
+
+ # First create the "mail directories".
+ mail_root = cfg.send('mail_root')
+ FileUtils.mkdir_p("#{mail_root}/example.com/alice")
+ FileUtils.mkdir_p("#{mail_root}/example.com/booger")
+ FileUtils.mkdir_p("#{mail_root}/example.com/jeremy")
+ FileUtils.mkdir_p("#{mail_root}/example.net/adam")
+
+ # Now the databases and their content.
+ connection = connect_superuser()
+
+ cfg.plugins.each do |plugin|
+ plugin_dbname = cfg.send("#{plugin}_dbname")
+ next if plugin_dbname.nil? # Skip the dovecot plugin
+ query = "CREATE DATABASE #{plugin_dbname};"
+ connection.query(query)
+
+ plugin_dbhost = cfg.send("#{plugin}_dbhost")
+ plugin_dbport = cfg.send("#{plugin}_dbport")
+ plugin_dbopts = cfg.send("#{plugin}_dbopts")
+ plugin_dbtty = cfg.send("#{plugin}_dbtty")
+ plugin_dbuser = cfg.send("#{plugin}_dbuser")
+ plugin_dbpass = cfg.send("#{plugin}_dbpass")
+
+ plugin_conn = PGconn.connect(plugin_dbhost,
+ plugin_dbport,
+ plugin_dbopts,
+ plugin_dbtty,
+ plugin_dbname,
+ plugin_dbuser,
+ plugin_dbpass)
+
+ sql = File.open("test/sql/#{plugin}.sql").read()
+ plugin_conn.query(sql)
+ sql = File.open("test/sql/#{plugin}-fixtures.sql").read()
+ plugin_conn.query(sql)
+ plugin_conn.close()
+ end
+
+ connection.close()
+ end
+
+
+ def teardown
+ # Drop all of the databases that were created in setup().
+ cfg = configuration()
+ connection = connect_superuser()
+
+ cfg.plugins.each do |plugin|
+ plugin_dbname = cfg.send("#{plugin}_dbname")
+ next if plugin_dbname.nil? # Skip the dovecot plugin
+ query = "DROP DATABASE #{plugin_dbname};"
+ connection.query(query)
+ end
+
+ connection.close()
+
+ # Get rid of the maildirs.
+ mail_root = cfg.send('mail_root')
+ FileUtils.rm_r(mail_root)
+ end
+
+end