packages feed

seihou-cli-0.4.0.0: test/Seihou/CLI/CommitMessageSpec.hs

module Seihou.CLI.CommitMessageSpec (tests) where

import Data.Text qualified as T
import Seihou.CLI.CommitMessage (generateCommitMessage, stripCodeFence)
import Seihou.Core.Types (ModuleName (..))
import Test.Hspec
import Test.Tasty
import Test.Tasty.Hspec (testSpec)

tests :: IO TestTree
tests = testSpec "Seihou.CLI.CommitMessage" spec

spec :: Spec
spec = do
  describe "generateCommitMessage" $ do
    it "returns a non-empty message for a single module" $ do
      msg <- generateCommitMessage [ModuleName "haskell-base"] "diff content"
      T.null msg `shouldBe` False

    it "returns a non-empty message for multiple modules" $ do
      msg <- generateCommitMessage [ModuleName "base", ModuleName "extras"] "diff content"
      T.null msg `shouldBe` False

    it "returns a non-empty message with empty diff" $ do
      msg <- generateCommitMessage [ModuleName "haskell-base"] ""
      T.null msg `shouldBe` False

  describe "stripCodeFence" $ do
    it "strips triple-backtick fencing" $ do
      stripCodeFence "```\nfeat: apply module\n```" `shouldBe` "feat: apply module"

    it "strips fencing with language tag" $ do
      stripCodeFence "```text\nfeat: apply module\n```" `shouldBe` "feat: apply module"

    it "leaves unfenced text unchanged" $ do
      stripCodeFence "feat: apply module" `shouldBe` "feat: apply module"

    it "leaves text with backticks in the middle unchanged" $ do
      let input = "feat: use ```code``` in template"
      stripCodeFence input `shouldBe` input

    it "handles empty input" $ do
      stripCodeFence "" `shouldBe` ""

    it "preserves multiline commit messages inside fences" $ do
      stripCodeFence "```\nfeat: apply modules\n\nApply base and extras.\n```"
        `shouldBe` "feat: apply modules\n\nApply base and extras."