safeFromSql,
quickQuery )
import Database.HDBC.Sqlite3 ( connectSqlite3 )
+import System.Console.CmdArgs.Default ( Default(..) )
import Test.Tasty ( TestTree, testGroup )
import Test.Tasty.HUnit ( (@?=), testCase )
+import Configuration ( Configuration(..) )
-- Type synonyms to make the signatures below a little more clear.
type Domain = String
where
num_spaces = longest_length - length d
+
+-- | The header that gets output before the summary report.
+--
summary_header :: String
summary_header = "Summary (number of mailboxes per domain)\n" ++
"----------------------------------------"
-report_summary :: IConnection a => a -> IO String
-report_summary conn = do
+
+-- | Given a connection, produces the summary report as a 'String'.
+--
+report_summary :: IConnection a => a -> String -> IO String
+report_summary conn query = do
list_rows <- quickQuery conn query []
let maybe_domain_counts = map list_to_domain_count list_rows
let domain_counts = catMaybes maybe_domain_counts
where
longest = maximumBy compare_dcs_by_length dcs
- query = "SELECT domain,COUNT(username) " ++
- "FROM mailbox " ++
- "GROUP BY domain "++
- "ORDER BY domain;"
-- | Construct a Domain -> [Username] (a DomainUserMap) map from a
-- fromList [("example.com",["user2","user1"]),("example.net",["user3"])]
--
construct_domain_user_map :: [DomainUser] -> DomainUserMap
-construct_domain_user_map dus =
- foldl' append_this_du Map.empty dus
+construct_domain_user_map =
+ foldl' append_this_du Map.empty
where
append_func :: Username -> (Maybe [Username]) -> (Maybe [Username])
append_func user maybe_userlist =
Map.alter (append_func user) domain du_map
+-- | The header that gets output before the detail report.
+--
detail_header :: String
detail_header = "Detail (list of all mailboxes by domain)\n" ++
"----------------------------------------"
-report_detail :: IConnection a => a -> IO String
-report_detail conn = do
+
+-- | Given a connection, produces the detail report as a 'String'.
+--
+report_detail :: IConnection a => a -> String -> IO String
+report_detail conn query = do
list_rows <- quickQuery conn query []
let maybe_domain_users = map list_to_domain_user list_rows
let domain_users = catMaybes maybe_domain_users
let report_body = Map.foldl (++) "" domain_report_map
return $ detail_header ++ report_body
where
- query = "SELECT domain,username " ++
- "FROM mailbox " ++
- "ORDER BY domain;"
-
format_domain :: Domain -> [Username] -> String
format_domain domain users =
(join "\n" (domain_header : indented_users)) ++ "\n"
indented_users = map (" " ++) users
-report :: IConnection a => a -> Bool -> IO String
-report conn do_detail =
- if do_detail
- then report_detail conn
- else report_summary conn
+-- | Given a connection and a 'Configuration', produces the report as
+-- a 'String'.
+--
+report :: IConnection a => Configuration -> a -> IO String
+report cfg conn =
+ if (detail cfg)
+ then report_detail conn (detail_query cfg)
+ else report_summary conn (summary_query cfg)
test_summary_report =
testCase desc $ do
conn <- connectSqlite3 "test/fixtures/postfixadmin.sqlite3"
- actual <- report_summary conn
+ let cfg = def :: Configuration
+ actual <- report_summary conn (summary_query cfg)
actual @?= expected
where
desc = "Summary report looks like it should"
test_detail_report =
testCase desc $ do
conn <- connectSqlite3 "test/fixtures/postfixadmin.sqlite3"
- actual <- report_detail conn
+ let cfg = def :: Configuration
+ actual <- report_detail conn (detail_query cfg)
actual @?= expected
where
desc = "Detail report looks like it should"