X-Git-Url: http://gitweb.michael.orlitzky.com/?p=mailshears.git;a=blobdiff_plain;f=test%2Fmailshears_test.rb;fp=test%2Fmailshears_test.rb;h=483c587a08d0a7682de79def66096ccfe50d4dac;hp=0000000000000000000000000000000000000000;hb=c7298aa01f95c9f6094b1bfeb05a16b20eb4de45;hpb=7f3b8d32352db4c9cd24591fd8006d27af824853 diff --git a/test/mailshears_test.rb b/test/mailshears_test.rb new file mode 100644 index 0000000..483c587 --- /dev/null +++ b/test/mailshears_test.rb @@ -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