]> gitweb.michael.orlitzky.com - mailshears.git/blobdiff - test/mailshears_test.rb
Begin cleaning up the test code to add some prune/mv cases.
[mailshears.git] / test / mailshears_test.rb
diff --git a/test/mailshears_test.rb b/test/mailshears_test.rb
new file mode 100644 (file)
index 0000000..483c587
--- /dev/null
@@ -0,0 +1,240 @@
+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