packages feed

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

module Seihou.CLI.DiffSpec (tests) where

import Data.Text qualified as T
import Seihou.CLI.Diff (formatDiffOutput)
import Seihou.Core.Types (ModuleName (..), TrackedFile (..), TrackedFileStatus (..))
import Test.Hspec
import Test.Tasty
import Test.Tasty.Hspec (testSpec)

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

spec :: Spec
spec = do
  describe "formatDiffOutput" $ do
    it "shows no-changes message when all files unchanged" $ do
      let tracked =
            [ TrackedFile "README.md" (ModuleName "haskell-base") TfsUnchanged,
              TrackedFile "src/Lib.hs" (ModuleName "haskell-base") TfsUnchanged
            ]
          result = formatDiffOutput False tracked
      result `shouldBe` "No changes since last generation.\n"

    it "includes header line" $ do
      let tracked =
            [ TrackedFile "src/Lib.hs" (ModuleName "haskell-base") TfsModified
            ]
          result = formatDiffOutput False tracked
      T.isInfixOf "Seihou Diff:" result `shouldBe` True

    it "shows modified files" $ do
      let tracked =
            [ TrackedFile "src/Lib.hs" (ModuleName "haskell-base") TfsModified
            ]
          result = formatDiffOutput False tracked
      T.isInfixOf "modified" result `shouldBe` True
      T.isInfixOf "src/Lib.hs" result `shouldBe` True

    it "shows deleted files" $ do
      let tracked =
            [ TrackedFile "app/Main.hs" (ModuleName "haskell-base") TfsDeleted
            ]
          result = formatDiffOutput False tracked
      T.isInfixOf "deleted" result `shouldBe` True
      T.isInfixOf "app/Main.hs" result `shouldBe` True

    it "shows summary count line" $ do
      let tracked =
            [ TrackedFile "README.md" (ModuleName "haskell-base") TfsUnchanged,
              TrackedFile "src/Lib.hs" (ModuleName "haskell-base") TfsModified,
              TrackedFile "app/Main.hs" (ModuleName "haskell-base") TfsDeleted
            ]
          result = formatDiffOutput False tracked
      T.isInfixOf "1 unchanged, 1 modified, 1 deleted" result `shouldBe` True

    it "shows module attribution in parentheses" $ do
      let tracked =
            [ TrackedFile "src/Lib.hs" (ModuleName "haskell-base") TfsModified
            ]
          result = formatDiffOutput False tracked
      T.isInfixOf "(haskell-base)" result `shouldBe` True

    it "hides unchanged files from main listing" $ do
      let tracked =
            [ TrackedFile "README.md" (ModuleName "haskell-base") TfsUnchanged,
              TrackedFile "src/Lib.hs" (ModuleName "haskell-base") TfsModified
            ]
          result = formatDiffOutput False tracked
          bodyLines = filter (T.isInfixOf "README.md") (T.lines result)
      bodyLines `shouldBe` []