import Test.Hspec import Azubi import Azubi.Core.Interpreter import Azubi.Core.Interpreter.LocalUnixInterpreter import System.Directory verbosity :: Verbosity verbosity = Verbose main :: IO () main = hspec $ do describe "whatIsBehind' should identify" $ do it "a Folder as IsFolder" $ do folderType <- whatIsBehind' pathOfFolder folderType `shouldBe` IsFolder it "a File as IsFile" $ do folderType <- whatIsBehind' pathOfFile folderType `shouldBe` IsFile it "a Link as IsSymlink " $ do folderType <- whatIsBehind' pathOfLink folderType `shouldBe` IsSymlink "./file" it "a Folder Link as IsSymlink " $ do folderType <- whatIsBehind' folderLinkPath folderType `shouldBe` IsSymlink "./folder" it "~/.cabal as IsFolder" $ do folderType <- whatIsBehind' "~/.cabal" folderType `shouldBe` IsFolder it "/usr as IsFolder" $ do folderType <- whatIsBehind' "/usr" folderType `shouldBe` IsFolder it "/donotexist as DoesNotExist" $ do noneType <- whatIsBehind' "/donotexist" noneType `shouldBe` DoesNotExist describe "folderExists should" $ do it "return a recursive folder existing check chain" $ do folderExists "/one/two" `shouldBe` States [FolderExists "/one/two"] [ States [FolderExists "/one"] [ State [Not (DoesExist "/one")] [Remove "/one"] (Just "delete folder : /one") , State [SkipChecks] [CreateFolder "/one"] (Just "create /one") ] Nothing , States [FolderExists "/one/two"] [ State [Not (DoesExist "/one/two")] [Remove "/one/two"] (Just "delete folder : /one/two") , State [SkipChecks] [CreateFolder "/one/two"] (Just "create /one/two") ] Nothing ] Nothing folderExists "/one/two/three" `shouldBe` States [FolderExists "/one/two/three"] [ States [FolderExists "/one"] [ State [Not (DoesExist "/one")] [Remove "/one"] (Just "delete folder : /one") , State [SkipChecks] [CreateFolder "/one"] (Just "create /one") ] Nothing , States [FolderExists "/one/two"] [ State [Not (DoesExist "/one/two")] [Remove "/one/two"] (Just "delete folder : /one/two") , State [SkipChecks] [CreateFolder "/one/two"] (Just "create /one/two") ] Nothing , States [FolderExists "/one/two/three"] [ State [Not (DoesExist "/one/two/three")] [Remove "/one/two/three"] (Just "delete folder : /one/two/three") , State [SkipChecks] [CreateFolder "/one/two/three"] (Just "create /one/two/three") ] Nothing ] Nothing folderExists "~/one/two/three" `shouldBe` States [FolderExists "~/one/two/three"] [ States [FolderExists "~/one"] [ State [Not (DoesExist "~/one")] [Remove "~/one"] (Just "delete folder : ~/one") , State [SkipChecks] [CreateFolder "~/one"] (Just "create ~/one") ] Nothing , States [FolderExists "~/one/two"] [ State [Not (DoesExist "~/one/two")] [Remove "~/one/two"] (Just "delete folder : ~/one/two") , State [SkipChecks] [CreateFolder "~/one/two"] (Just "create ~/one/two") ] Nothing , States [FolderExists "~/one/two/three"] [ State [Not (DoesExist "~/one/two/three")] [Remove "~/one/two/three"] (Just "delete folder : ~/one/two/three") , State [SkipChecks] [CreateFolder "~/one/two/three"] (Just "create ~/one/two/three") ] Nothing ] Nothing describe "basic functions" $ do it "testing should be set up properly" $ do removePathForcibly dynamicFolderPath folderType <- whatIsBehind' dynamicFolderPath folderType `shouldBe` DoesNotExist it "should create a file" $ do let file = (dynamicSubPath "file") executeIt [content file ["test"]] folderType <- whatIsBehind' file folderType `shouldBe` IsFile it "should create a folder" $ do let folder = (dynamicSubPath "folder") executeIt [folderExists folder] folderType <- whatIsBehind' folder folderType `shouldBe` IsFolder it "should create a folder even if it is a file" $ do let folder = (dynamicSubPath "should/be_a_folder") executeIt [content folder ["test"]] executeIt [folderExists folder] folderType <- whatIsBehind' folder folderType `shouldBe` IsFolder it "should create a file even if it is a folder" $ do let file = (dynamicSubPath "should/be_a_file") executeIt [folderExists file] executeIt [content file ["test"]] folderType <- whatIsBehind' file folderType `shouldBe` IsFile describe "preProcessState should" $ do it "replace ~ in paths" $ do home <- getHomeDirectory home `shouldNotBe` "~" state <- prePorcessState (UnixSystem verbosity) $ State [FolderExists "~/test"] [CreateFolder "~/test"] Nothing state `shouldBe` State [FolderExists $ home ++ "/test"] [CreateFolder $ home ++ "/test"] Nothing -- run describe "run once should" $ do it "create a file for a successful command" $ do beforeFile <- whatIsBehind' $ dynamicSubPath "run-once-success" beforeFile `shouldBe` DoesNotExist executeIt [run (Once "exit" ["0"] $ dynamicSubPath "run-once-success")] resultFile <- whatIsBehind' $ dynamicSubPath "run-once-success" resultFile `shouldBe` IsFile it "create no file for a failed command" $ do beforeFile <- whatIsBehind' $ dynamicSubPath "run-once-failure" beforeFile `shouldBe` DoesNotExist executeIt [run (Once "exit" ["1"] $ dynamicSubPath "run-once-failure")] resultFile <- whatIsBehind' $ dynamicSubPath "run-once-failure" resultFile `shouldBe` DoesNotExist describe "run which-creates should" $ do it "should run if outcome file does not exist" $ do beforeFile <- whatIsBehind' $ dynamicSubPath "run-which-creates-success" beforeFile `shouldBe` DoesNotExist executeIt [ run (WithResults "touch" [dynamicSubPath "run-which-creates-success"] [Creates $ dynamicSubPath "run-which-creates-success"]) ] resultFile <- whatIsBehind' $ dynamicSubPath "run-which-creates-success" resultFile `shouldBe` IsFile it "should not run if outcome file does exist" $ do beforeFile <- whatIsBehind' $ dynamicSubPath "run-which-creates-success" beforeFile `shouldBe` IsFile executeIt [ run (WithResults "touch" [dynamicSubPath "run-which-creates-failure"] [Creates $ dynamicSubPath "run-which-creates-success"]) ] resultFile <- whatIsBehind' $ dynamicSubPath "run-which-creates-failure" resultFile `shouldBe` DoesNotExist executeIt :: [State] -> IO () executeIt = execute (LocalContext $ UnixSystem verbosity) dynamicFolderPath :: String dynamicFolderPath = "./dynamic-test-folder" dynamicSubPath :: String -> String dynamicSubPath path = dynamicFolderPath ++ "/" ++ path pathOfFolder :: String pathOfFolder = "./test-resources/folder" pathOfFile :: String pathOfFile = "./test-resources/file" pathOfLink :: String pathOfLink = "./test-resources/filelink" folderLinkPath :: String folderLinkPath = "./test-resources/folderlink"