stack-2.11.1: src/test/Stack/UploadSpec.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Stack.UploadSpec
( spec
) where
import Data.Bits ((.&.))
import RIO
( Bool (..), IO, IsString, Maybe (..), String, ($), finally
, readFileBinary, replicateM_, runRIO, unless
, withSystemTempDirectory
)
import RIO.Directory
( emptyPermissions, getPermissions, setOwnerReadable
, setOwnerWritable
)
import RIO.FilePath ( (</>) )
import Stack.Upload
( HackageKey (..), maybeGetHackageKey, writeFilePrivate )
import System.Environment ( setEnv, unsetEnv )
import System.Permissions ( osIsWindows )
import System.PosixCompat.Files ( getFileStatus, fileMode )
import Test.Hspec ( Spec, example, it, shouldBe, shouldReturn )
spec :: Spec
spec = do
it "writeFilePrivate" $ example $ withSystemTempDirectory "writeFilePrivate" $ \dir -> replicateM_ 2 $ do
let fp = dir </> "filename"
contents :: IsString s => s
contents = "These are the contents"
writeFilePrivate fp contents
actual <- readFileBinary fp
actual `shouldBe` contents
perms <- getPermissions fp
perms `shouldBe` setOwnerWritable True (setOwnerReadable True emptyPermissions)
unless osIsWindows $ do
status <- getFileStatus fp
(fileMode status .&. 0o777) `shouldBe` 0o600
it "finds a HACKAGE_KEY env variable" $ do
runRIO () maybeGetHackageKey `shouldReturn` Nothing
withEnv "HACKAGE_KEY" "api_key"
$ runRIO () maybeGetHackageKey `shouldReturn` Just (HackageKey "api_key")
withEnv :: String -> String -> IO a -> IO a
withEnv k v f = do
setEnv k v
f `finally` unsetEnv k