packages feed

static-ls-0.1.0: test/StaticLS/HIE/FileSpec.hs

module StaticLS.HIE.FileSpec (spec) where

import Control.Monad.Trans.Except (runExceptT)
import Control.Monad.Trans.Maybe (runMaybeT)
import StaticLS.HIE.File
import StaticLS.StaticEnv
import StaticLS.StaticEnv.Options
import System.Directory
import System.FilePath
import Test.Hspec
import qualified TestImport as Test
import qualified TestImport.Assert as Test

spec :: Spec
spec = do
    describe "Can convert from src to hie file" $ do
        describe "src file to hie file" $ do
            it "returns a valid hie file when called on a src file" $ do
                staticEnv <- Test.initStaticEnv
                hieFile <-
                    runStaticLs staticEnv $
                        runMaybeT $
                            srcFilePathToHieFilePath "src/StaticLS/HIE/File.hs"
                let relativeHieFile = makeRelative staticEnv.wsRoot <$> hieFile
                hieFileExists <- maybe (pure False) doesFileExist relativeHieFile

                relativeHieFile `shouldBe` Just "test/TestData/.hiefiles/StaticLS/HIE/File.hie"
                hieFileExists `shouldBe` True

            it "returns a valid hie file when called on a test/ file" $ do
                staticEnv <- Test.initStaticEnv
                hieFile <-
                    runStaticLs staticEnv $
                        runMaybeT $
                            srcFilePathToHieFilePath "test/TestData/Mod1.hs"
                let relativeHieFile = makeRelative staticEnv.wsRoot <$> hieFile
                hieFileExists <- maybe (pure False) doesFileExist relativeHieFile

                relativeHieFile `shouldBe` Just "test/TestData/.hiefiles/TestData/Mod1.hie"
                hieFileExists `shouldBe` True

    describe "getHieFile" $ do
        it "Returns a valid hie file" $ do
            staticEnv <- Test.initStaticEnv
            hieFile <-
                runStaticLs staticEnv $
                    runExceptT $
                        getHieFile "test/TestData/.hiefiles/TestData/Mod1.hie"
            _ <- Test.assertRight "expected succesful read" hieFile
            pure ()

        it "Does not crash when given an invalid hie file to read " $ do
            let emptyOpts =
                    StaticEnvOptions
                        { optionHieDbPath = Nothing
                        , optionHieFilesPath = Nothing
                        }
            staticEnv <- Test.initStaticEnvOpts emptyOpts
            hieFile <-
                runStaticLs staticEnv $
                    runExceptT $
                        getHieFile "./test/TestData/Mod1.hs"
            _ <- Test.assertLeft "expected failure" hieFile
            pure ()

        it "Does not crash when given no file to read" $ do
            let emptyOpts =
                    StaticEnvOptions
                        { optionHieDbPath = Nothing
                        , optionHieFilesPath = Nothing
                        }
            staticEnv <- Test.initStaticEnvOpts emptyOpts
            hieFile <-
                runStaticLs staticEnv $
                    runExceptT $
                        getHieFile ""
            _ <- Test.assertLeft "expected failure" hieFile
            pure ()