packages feed

seihou-core-0.4.0.0: test/Seihou/Core/ContextSpec.hs

module Seihou.Core.ContextSpec (tests) where

import Data.Map.Strict qualified as Map
import Seihou.Core.Context
import Test.Hspec
import Test.Tasty
import Test.Tasty.Hspec (testSpec)

tests :: IO TestTree
tests = testSpec "Seihou.Core.Context" spec

spec :: Spec
spec = do
  describe "resolveContext" $ do
    it "returns CLI flag when provided" $ do
      result <- resolveContext (Just "work") Map.empty
      result `shouldBe` Just "work"

    it "strips whitespace from CLI flag" $ do
      result <- resolveContext (Just "  work  ") Map.empty
      result `shouldBe` Just "work"

    it "ignores empty CLI flag and falls through" $ do
      result <- resolveContext (Just "") Map.empty
      result `shouldBe` Nothing

    it "returns SEIHOU_CONTEXT env var when CLI flag is absent" $ do
      let envVars = Map.singleton "SEIHOU_CONTEXT" "personal"
      result <- resolveContext Nothing envVars
      result `shouldBe` Just "personal"

    it "CLI flag takes precedence over env var" $ do
      let envVars = Map.singleton "SEIHOU_CONTEXT" "personal"
      result <- resolveContext (Just "work") envVars
      result `shouldBe` Just "work"

    it "ignores empty SEIHOU_CONTEXT env var" $ do
      let envVars = Map.singleton "SEIHOU_CONTEXT" ""
      result <- resolveContext Nothing envVars
      result `shouldBe` Nothing

    it "returns Nothing when no source provides a context" $ do
      result <- resolveContext Nothing Map.empty
      result `shouldBe` Nothing

  describe "validateContextName" $ do
    it "accepts a normal context name" $ do
      validateContextName "work" `shouldBe` Nothing

    it "accepts a hyphenated context name" $ do
      validateContextName "my-work" `shouldBe` Nothing

    it "rejects empty context name" $ do
      validateContextName "" `shouldSatisfy` (/= Nothing)

    it "rejects context name containing '..'" $ do
      validateContextName "foo..bar" `shouldSatisfy` (/= Nothing)

    it "rejects context name containing '/'" $ do
      validateContextName "foo/bar" `shouldSatisfy` (/= Nothing)