|
| 1 | +{-# LANGUAGE OverloadedStrings #-} |
| 2 | +{-# LANGUAGE OverloadedLists #-} |
| 3 | + |
| 4 | +module Common.Integration (tests) where |
| 5 | + |
| 6 | +import Test.HUnit |
| 7 | +import Turtle |
| 8 | +import Prelude hiding (FilePath) |
| 9 | +import qualified Data.Map.Strict as Map |
| 10 | +import qualified Control.Foldl as Fold |
| 11 | +import qualified Data.Text as T |
| 12 | +import qualified Data.List as List (sort) |
| 13 | + |
| 14 | +import TestHelpers |
| 15 | +import Hledger.Flow.Import.Types |
| 16 | +import Hledger.Flow.Common |
| 17 | +import Control.Concurrent.STM |
| 18 | + |
| 19 | +testHiddenFiles = TestCase ( |
| 20 | + sh ( |
| 21 | + do |
| 22 | + tmpdir <- using (mktempdir "." "hlflow") |
| 23 | + let tmpJournals = map (tmpdir </>) journalFiles :: [FilePath] |
| 24 | + let tmpExtras = map (tmpdir </>) extraFiles :: [FilePath] |
| 25 | + let tmpHidden = map (tmpdir </>) hiddenFiles :: [FilePath] |
| 26 | + let onDisk = List.sort $ tmpJournals ++ tmpExtras ++ tmpHidden |
| 27 | + touchAll onDisk |
| 28 | + filtered <- (fmap List.sort) $ shellToList $ onlyFiles $ select onDisk |
| 29 | + let expected = List.sort $ tmpExtras ++ tmpJournals |
| 30 | + liftIO $ assertEqual "Hidden files should be excluded" expected filtered |
| 31 | + ) |
| 32 | + ) |
| 33 | + |
| 34 | +testDirOrPwd = TestCase ( |
| 35 | + sh ( |
| 36 | + do |
| 37 | + currentDir <- fmap (\p -> directory (p </> "t")) pwd |
| 38 | + tmpdir <- using (mktempdir "." "hlflow") |
| 39 | + let fooDir = collapse $ currentDir </> tmpdir </> "foo/" |
| 40 | + let barDir = collapse $ currentDir </> tmpdir </> "bar/" |
| 41 | + mkdir fooDir |
| 42 | + mkdir barDir |
| 43 | + d1 <- liftIO $ dirOrPwd Nothing |
| 44 | + liftIO $ assertEqual "dirOrPwd returns pwd as a fallback" currentDir d1 |
| 45 | + liftIO $ assertEqual "dirOrPwd assumes the fallback is a directory" (directory d1) d1 |
| 46 | + d2 <- liftIO $ dirOrPwd $ Just $ tmpdir </> "foo" |
| 47 | + liftIO $ assertEqual "dirOrPwd returns the supplied dir - no trailing slash supplied" fooDir d2 |
| 48 | + liftIO $ assertEqual "dirOrPwd assumes the supplied dir is a directory - no trailing slash supplied" (directory d2) d2 |
| 49 | + d3 <- liftIO $ dirOrPwd $ Just $ tmpdir </> "bar/" |
| 50 | + liftIO $ assertEqual "dirOrPwd returns the supplied dir - trailing slash supplied" barDir d3 |
| 51 | + liftIO $ assertEqual "dirOrPwd assumes the supplied dir is a directory - trailing slash supplied" (directory d3) d3 |
| 52 | + ) |
| 53 | + ) |
| 54 | + |
| 55 | +testDetermineBaseDir = TestCase ( |
| 56 | + sh ( |
| 57 | + do |
| 58 | + error1 <- liftIO $ determineBaseDir'' "/path/to/dir" "/path/to/dir" |
| 59 | + liftIO $ assertEqual "determineBaseDir produces an error message when given a non-existant dir" (Left $ errorMessageBaseDir "/path/to/dir") error1 |
| 60 | + tmpdir <- using (mktempdir "." "hlflow") |
| 61 | + |
| 62 | + let unrelatedDir = collapse $ tmpdir </> "unrelated" |
| 63 | + mkdir unrelatedDir |
| 64 | + |
| 65 | + bdUnrelated <- liftIO $ determineBaseDir'' unrelatedDir unrelatedDir |
| 66 | + liftIO $ assertEqual "determineBaseDir produces an error message when it cannot find a baseDir" (Left $ errorMessageBaseDir unrelatedDir) bdUnrelated |
| 67 | + |
| 68 | + currentDir <- pwd |
| 69 | + let baseDir = forceTrailingSlash $ collapse $ currentDir </> tmpdir </> "bd1" |
| 70 | + |
| 71 | + let importDir = baseDir </> "import" |
| 72 | + let ownerDir = importDir </> "john" |
| 73 | + let bankDir = ownerDir </> "mybank" |
| 74 | + let accDir = bankDir </> "myacc" |
| 75 | + let inDir = accDir </> "1-in" |
| 76 | + let yearDir = inDir </> "2019" |
| 77 | + mktree yearDir |
| 78 | + |
| 79 | + let reportDir = baseDir </> "report" |
| 80 | + mkdir reportDir |
| 81 | + |
| 82 | + cd baseDir |
| 83 | + bd <- liftIO $ determineBaseDir Nothing |
| 84 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - in the base dir" baseDir bd |
| 85 | + |
| 86 | + cd reportDir |
| 87 | + bdReport <- liftIO $ determineBaseDir Nothing |
| 88 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - report dir" baseDir bdReport |
| 89 | + |
| 90 | + cd yearDir |
| 91 | + bdYear <- liftIO $ determineBaseDir Nothing |
| 92 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - year dir" baseDir bdYear |
| 93 | + |
| 94 | + cd inDir |
| 95 | + bdIn <- liftIO $ determineBaseDir Nothing |
| 96 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - input dir" baseDir bdIn |
| 97 | + |
| 98 | + cd accDir |
| 99 | + bdAcc <- liftIO $ determineBaseDir Nothing |
| 100 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - account dir" baseDir bdAcc |
| 101 | + |
| 102 | + cd bankDir |
| 103 | + bdBank <- liftIO $ determineBaseDir Nothing |
| 104 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - bank dir" baseDir bdBank |
| 105 | + |
| 106 | + cd ownerDir |
| 107 | + bdOwner <- liftIO $ determineBaseDir Nothing |
| 108 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - owner dir" baseDir bdOwner |
| 109 | + |
| 110 | + cd importDir |
| 111 | + bdImport <- liftIO $ determineBaseDir Nothing |
| 112 | + liftIO $ assertEqual "determineBaseDir searches from pwd upwards until it finds a dir containing 'import' - import dir" baseDir bdImport |
| 113 | + ) |
| 114 | + ) |
| 115 | + |
| 116 | +testFilterPaths = TestCase ( |
| 117 | + sh ( |
| 118 | + do |
| 119 | + tmpdir <- using (mktempdir "." "hlflow") |
| 120 | + let tmpJournals = map (tmpdir </>) journalFiles :: [FilePath] |
| 121 | + let tmpExtras = map (tmpdir </>) extraFiles :: [FilePath] |
| 122 | + let tmpHidden = map (tmpdir </>) hiddenFiles :: [FilePath] |
| 123 | + let onDisk = List.sort $ tmpJournals ++ tmpExtras ++ tmpHidden |
| 124 | + touchAll onDisk |
| 125 | + |
| 126 | + let nonExistant = map (tmpdir </>) ["where", "is", "my", "mind"] |
| 127 | + let toFilter = nonExistant ++ onDisk |
| 128 | + filtered <- single $ filterPaths testfile toFilter |
| 129 | + let actual = List.sort filtered |
| 130 | + liftIO $ assertEqual "The filtered paths should exclude files not actually on disk" onDisk actual |
| 131 | + ) |
| 132 | + ) |
| 133 | + |
| 134 | + |
| 135 | +tests = TestList [testDirOrPwd, testDetermineBaseDir, testHiddenFiles, testFilterPaths] |
0 commit comments