MyNixOS website logo
Description

Extensible fake file system for testing.

fakefs

Extensible fake file system for testing.

Provides a simple Monad transformer FileSystemT, intended to make a fake file system.
Against its name, FileSystemT imitates very limited feature of a file system:
It's essentially just a newtype of StateT (Map FilePath contents) m a, where the type variable contents can be any type suitable for your tests.
For example:

  • If your tests have to handle only binary contents of a file, contents should be ByteString.
  • If your tests have to handle only text contents of a file, contents should be Text.
  • If your tests have to handle binary contents of a file with its permisson, contents should be (Permission, ByteString).
  • etc.

Example

-- BEGINNING OF EXAMPLE

import Control.Monad
import Control.Monad.Catch.Pure
import Data.List
import qualified Data.Map.Strict as M
import Data.Maybe
import Test.Hspec
import Test.FileSystem.Fake

import Prelude hiding (readFile, appendFile)

type YourFsM = FileSystemT String Catch

-- | Record of functions to stub IO actions
data FsActions m = FsActions
    { readFile :: FilePath -> m String
    , appendFile :: FilePath -> String -> m ()
    }

fsActionsForTesting :: FsActions YourFsM
fsActionsForTesting = FsActions
    { readFile = readPath
    , appendFile = \path contents ->
        modifyPath path (Just . (++ contents) . fromMaybe "")
    }


-- | The function you test.
collectMatchedPaths :: MonadThrow m => FsActions m -> (String -> Bool) -> FilePath -> [FilePath] -> m ()
collectMatchedPaths acts p outPath = mapM_ $ \path -> do
    contents <- readFile acts path
    when (p contents) $
        appendFile acts outPath $ path ++ "\n"


main :: IO ()
main = hspec $
    describe "collectMatchedPaths" $
        it "collect paths whose content matches the given condition" $ do
            let initialFs = M.fromList
                    [ ("a.txt", "aaaaa\n")
                    , ("b.hs", "main = undefined\n")
                    , ("c.c", "#include <stdio.h>\n")
                    ]
                outPath = "result.txt"
                args = M.keys initialFs
                Right resultFs = runCatch . (`execFileSystemT` initialFs)
                    $ collectMatchedPaths fsActionsForTesting (isInfixOf "in") outPath args

            resultFs M.! outPath `shouldBe` "b.hs\nc.c\n"

-- END
Metadata

Version

0.3.0.2

License

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows