packages feed

git-vogue-0.1.0.0: tests/plugins.hs

--
-- Copyright © 2013-2015 Anchor Systems, Pty Ltd and Others
--
-- The code in this file, and the program it is a part of, is
-- made available to you by its authors as open source software:
-- you can redistribute it and/or modify it under the terms of
-- the 3-clause BSD licence.
--

{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Description: Test git repository setup.
module Main where

import           Control.Monad.IO.Class ()
import           Data.Monoid
import           System.FilePath
import           Test.Hspec

import           Git.Vogue.Plugins
import           Git.Vogue.Types

failingExecutor, succeedingExecutor :: b -> IO (Status a)
failingExecutor    = const . return $ Failure mempty mempty
succeedingExecutor = const . return $ Success mempty mempty

main :: IO ()
main = hspec $ do
    describe "module collation" $ do
        it "maximum of statuses is failure" $
            maximum [Success mempty mempty, Failure mempty mempty]
                `shouldBe` Failure mempty mempty

        it "fails if one module fails" $ do
            getWorst failingExecutor ["a", "b"]
              >>= (`shouldBe` Failure mempty "\ESC[33m failed\ESC[0m with:\n\n\ESC[33m failed\ESC[0m with:\n\n")
            getWorst failingExecutor  ["monkey"]
              >>= (`shouldBe` Failure mempty "\ESC[33m failed\ESC[0m with:\n\n")

        it "succeeds if all modules succeed" $ do
            getWorst succeedingExecutor ["a", "b"]
              >>= (`shouldBe` Success mempty "\ESC[32m succeeded\ESC[0m with:\n\n\ESC[32m succeeded\ESC[0m with:\n\n")
            getWorst succeedingExecutor ["monkey"]
              >>= (`shouldBe` Success mempty "\ESC[32m succeeded\ESC[0m with:\n\n")

    describe "IO module executor" $ do
        describe "check" $ do
            it "fails on failing module" $
                runCheckExecutor FindAll "failing"
                                (Failure "failing" "ohnoes\n")

            it "fails on succeeding module" $
                runCheckExecutor FindAll "succeeding"
                                (Success "succeeding" "yay\n")

            it "fails on exploding module" $
                runCheckExecutor FindAll "exploding"
                                (Catastrophe 3 "exploding" "something broke\n")

        describe "fix" $ do
            it "fails on failing module" $
                runFixExecutor FindAll "failing"
                                (Failure "failing" "ohnoes\n")

            it "fails on succeeding module" $
                runFixExecutor FindAll "succeeding"
                                (Success "succeeding" "yay\n")

            it "fails on exploding module" $
                runFixExecutor FindAll "exploding"
                                (Catastrophe 3 "exploding" "something broke\n")

runCheckExecutor :: SearchMode -> FilePath -> Status Check -> Expectation
runCheckExecutor = runTestExecutor executeCheck

runFixExecutor :: SearchMode -> FilePath -> Status Fix -> Expectation
runFixExecutor = runTestExecutor executeFix

runTestExecutor
    :: (PluginExecutorImpl IO -> SearchMode -> Plugin -> IO (Status a))
    -> SearchMode
    -> FilePath
    -> Status a
    -> Expectation
runTestExecutor act search_mode file expected =
    act ioPluginExecutorImpl search_mode (Plugin ("fixtures" </> file))
      >>= (`shouldBe` expected)