about summary refs log blame commit diff
path: root/nix/utils/tests/default.nix
blob: b87c29cac722e319df7e90f4081ddc3dd1349203 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                  
                       

                 
            
                 









                                                             

                               
                                              

                                       
                                           

                                    

                                                    

                                       
                                                               

                                               
                                                                    

                                                       

                                         

                                      
                                                

                                    
                                                  

                                 

                                                

                                
                                                     

                                     
                                                   

                                        
                                                        

                           
                                              

                             
                                         

                                  


                                                      

                                                              




                                                        
 




                                                                           

                                                                    







                                                                                 

    


                                                                    

                                      

                                                                         

                                         
                                                

                                      



                                                                  
                                                

                                   
    



                          
                      
                    
 
{ depot, lib, ... }:

let
  inherit (depot.nix.runTestsuite)
    runTestsuite
    it
    assertEq
    assertThrows
    assertDoesNotThrow
    ;

  inherit (depot.nix.utils)
    isDirectory
    realPathIsDirectory
    isRegularFile
    isSymlink
    pathType
    storePathName
    ;

  assertUtilsPred = msg: act: exp: [
    (assertDoesNotThrow "${msg} does not throw" act)
    (assertEq msg (builtins.tryEval act).value exp)
  ];

  pathPredicates = it "judges paths correctly" (lib.flatten [
    # isDirectory
    (assertUtilsPred "directory isDirectory"
      (isDirectory ./directory)
      true)
    (assertUtilsPred "symlink not isDirectory"
      (isDirectory ./symlink-directory)
      false)
    (assertUtilsPred "file not isDirectory"
      (isDirectory ./directory/file)
      false)
    # realPathIsDirectory
    (assertUtilsPred "directory realPathIsDirectory"
      (realPathIsDirectory ./directory)
      true)
    (assertUtilsPred "symlink to directory realPathIsDirectory"
      (realPathIsDirectory ./symlink-directory)
      true)
    (assertUtilsPred "realPathIsDirectory resolves chained symlinks"
      (realPathIsDirectory ./symlink-symlink-directory)
      true)
    # isRegularFile
    (assertUtilsPred "file isRegularFile"
      (isRegularFile ./directory/file)
      true)
    (assertUtilsPred "symlink not isRegularFile"
      (isRegularFile ./symlink-file)
      false)
    (assertUtilsPred "directory not isRegularFile"
      (isRegularFile ./directory)
      false)
    # isSymlink
    (assertUtilsPred "symlink to file isSymlink"
      (isSymlink ./symlink-file)
      true)
    (assertUtilsPred "symlink to directory isSymlink"
      (isSymlink ./symlink-directory)
      true)
    (assertUtilsPred "symlink to symlink isSymlink"
      (isSymlink ./symlink-symlink-file)
      true)
    (assertUtilsPred "symlink to missing file isSymlink"
      (isSymlink ./missing)
      true)
    (assertUtilsPred "directory not isSymlink"
      (isSymlink ./directory)
      false)
    (assertUtilsPred "file not isSymlink"
      (isSymlink ./directory/file)
      false)
    # missing files throw
    (assertThrows "isDirectory throws on missing file"
      (isDirectory ./does-not-exist))
    (assertThrows "realPathIsDirectory throws on missing file"
      (realPathIsDirectory ./does-not-exist))
    (assertThrows "isRegularFile throws on missing file"
      (isRegularFile ./does-not-exist))
    (assertThrows "isSymlink throws on missing file"
      (isSymlink ./does-not-exist))
  ]);

  symlinkPathTypeTests = it "correctly judges symlinks" [
    (assertEq "symlinks to directories are detected correcty"
      ((pathType ./symlink-directory).symlink or null) "directory")
    (assertEq "symlinks to symlinks to directories are detected correctly"
      ((pathType ./symlink-symlink-directory).symlink or null) "directory")
    (assertEq "symlinks to nowhere are not distinguished from files"
      ((pathType ./missing).symlink or null) "regular-or-missing")

    # These tests are commented out because they no longer work with
    # restrict-eval turned on.

    # (assertEq "symlinks to files are detected-ish"
    #   ((pathType ./symlink-file).symlink or null) "regular-or-missing")
    # (assertEq "symlinks to symlinks to files are detected-ish"
    #   ((pathType ./symlink-symlink-file).symlink or null) "regular-or-missing")
  ];

  cheddarStorePath =
    builtins.unsafeDiscardStringContext depot.tools.cheddar.outPath;

  cleanedSource = lib.cleanSource ./.;

  storePathNameTests = it "correctly gets the basename of a store path" [
    (assertEq "base name of a derivation"
      (storePathName depot.tools.cheddar)
      depot.tools.cheddar.name)
    (assertEq "base name of a store path string"
      (storePathName cheddarStorePath)
      depot.tools.cheddar.name)
    (assertEq "base name of a path within a store path"
      (storePathName "${cheddarStorePath}/bin/cheddar") "cheddar")
    (assertEq "base name of a path"
      (storePathName ../default.nix) "default.nix")
    (assertEq "base name of a cleanSourced path"
      (storePathName cleanedSource)
      cleanedSource.name)
  ];
in

runTestsuite "nix.utils" [
  pathPredicates
  symlinkPathTypeTests
  storePathNameTests
]