packages feed

clod-0.1.0: test/Clod/FileSystem/ProcessingSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

-- |
-- Module      : Clod.FileSystem.ProcessingSpec
-- Description : Tests for file processing functions
-- Copyright   : (c) Fuzz Leonard, 2025
-- License     : MIT
-- Maintainer  : cyborg@bionicfuzz.com
-- Stability   : experimental
--
-- This module contains tests for file processing functionality.

module Clod.FileSystem.ProcessingSpec (spec) where

import Test.Hspec
import System.FilePath ((</>))
import System.Directory (doesFileExist) 
import System.IO.Temp (withSystemTempDirectory)

import Clod.Types
import Clod.FileSystem.Processing
import Clod.TestHelpers (defaultTestConfig)

-- | Test specification for FileSystem.Processing module
spec :: Spec
spec = do
  writeManifestFileSpec
  createOptimizedNameSpec

-- | Tests for manifest file creation
writeManifestFileSpec :: Spec
writeManifestFileSpec = describe "writeManifestFile" $ do
  it "writes entries to the manifest file" $ do
    -- Create a temp directory
    withSystemTempDirectory "clod-test" $ \tmpDir -> do
      -- Create a manifest file path and entries
      let manifestPath = tmpDir </> "manifest.dhall"
          entry1 = (OptimizedName "src-main.js", OriginalPath "src/main.js")
          entry2 = (OptimizedName "src-utils.js", OriginalPath "src/utils.js")
          entries = [entry1, entry2]
          config = defaultTestConfig tmpDir
      
      -- Create a write capability for the temp directory
      let writeCap = fileWriteCap [tmpDir]
      
      -- Write the manifest
      result <- runClodM config $ writeManifestFile writeCap manifestPath entries
      
      -- Verify result
      case result of
        Left err -> expectationFailure $ "Failed to write manifest: " ++ show err
        Right _ -> do
          -- Check file exists
          fileExists <- doesFileExist manifestPath
          fileExists `shouldBe` True
          
          -- Check content
          content <- readFile manifestPath
          content `shouldContain` "`src-main.js` = \"src/main.js\""
          content `shouldContain` "`src-utils.js` = \"src/utils.js\""

-- | Tests for optimized name creation
createOptimizedNameSpec :: Spec
createOptimizedNameSpec = describe "createOptimizedName" $ do
  it "flattens directory structure" $ do
    let path = "src/components/Button.jsx"
        optimized = createOptimizedName path
    
    unOptimizedName optimized `shouldBe` "src-components-Button.jsx"
  
  it "handles files in the root directory" $ do
    let path = "README.md"
        optimized = createOptimizedName path
    
    unOptimizedName optimized `shouldBe` "README.md"
  
  it "transforms hidden files" $ do
    let path = ".gitignore"
        optimized = createOptimizedName path
    
    unOptimizedName optimized `shouldBe` "dot--gitignore"
  
  it "works with nested hidden directories" $ do
    let path = ".github/workflows/deploy.yml"
        optimized = createOptimizedName path
    
    unOptimizedName optimized `shouldBe` "dot--github-workflows-deploy.yml"