diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # shake-dhall
 
+## 0.1.1.2
+
+  * Add test suite
+  * Fix bug uncovered by test suite
+  * Canonicalize paths
+
 ## 0.1.1.1
 
   * Documentation typos
diff --git a/shake-dhall.cabal b/shake-dhall.cabal
--- a/shake-dhall.cabal
+++ b/shake-dhall.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            shake-dhall
-version:         0.1.1.1
+version:         0.1.1.2
 license:         BSD3
 license-file:    LICENSE
 copyright:       Copyright: (c) 2020 Vanessa McHale
@@ -32,7 +32,34 @@
         text -any,
         containers >=0.6,
         shake -any,
-        filepath -any
+        filepath -any,
+        directory -any
+
+    if impl(ghc >=8.0)
+        ghc-options:
+            -Wincomplete-uni-patterns -Wincomplete-record-updates
+            -Wredundant-constraints -Widentities
+
+    if impl(ghc >=8.4)
+        ghc-options: -Wmissing-export-lists
+
+    if impl(ghc >=8.2)
+        ghc-options: -Wcpp-undef
+
+    if impl(ghc >=8.10)
+        ghc-options: -Wunused-packages
+
+test-suite shake-dhall-test
+    type:             exitcode-stdio-1.0
+    main-is:          Spec.hs
+    hs-source-dirs:   test
+    default-language: Haskell2010
+    ghc-options:      -threaded -rtsopts "-with-rtsopts=-N -K1K" -Wall
+    build-depends:
+        base -any,
+        shake-dhall -any,
+        tasty -any,
+        tasty-hunit -any
 
     if impl(ghc >=8.0)
         ghc-options:
diff --git a/src/Dhall/Dep.hs b/src/Dhall/Dep.hs
--- a/src/Dhall/Dep.hs
+++ b/src/Dhall/Dep.hs
@@ -3,6 +3,7 @@
                  ) where
 
 import           Control.Exception         (throw)
+import           Control.Monad             ((<=<))
 import           Data.Containers.ListUtils (nubOrd)
 import           Data.Foldable             (toList)
 import           Data.Maybe                (catMaybes)
@@ -11,6 +12,8 @@
                                             importHashed, importType)
 import           Dhall.Import              (localToPath)
 import           Dhall.Parser              (exprFromText)
+import           System.Directory          (canonicalizePath,
+                                            makeRelativeToCurrentDirectory)
 import           System.FilePath           (isAbsolute, takeDirectory, (</>))
 
 -- | Given a path, the file paths it depends on
@@ -21,15 +24,20 @@
         fileMod fp' = if isAbsolute fp' then fp' else fileDir </> fp'
         tree = either throw id (exprFromText fp contents)
         imports = toList tree
-    catMaybes <$> traverse (fmap (fileMod <$>) . fromImport) imports
+    traverse canonicalizeRelative =<<
+        catMaybes <$> traverse (fmap (fileMod <$>) . fromImport) imports
 
+canonicalizeRelative :: FilePath -> IO FilePath
+canonicalizeRelative = makeRelativeToCurrentDirectory <=< canonicalizePath
+
 -- | Get all transitive dependencies
 getAllFileDeps :: FilePath -> IO [FilePath]
 getAllFileDeps fp = do
     deps <- getFileDeps fp
-    level <- traverse getFileDeps deps
-    let next = nubOrd (mconcat (deps : level))
-    pure $ if null level then deps else next
+    level <- traverse getAllFileDeps deps
+    pure $ if null level
+        then deps
+        else nubOrd (concat (deps : level))
 
 fromImport :: Import -> IO (Maybe FilePath)
 fromImport = fromImportType . importType . importHashed
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,15 @@
+module Main ( main ) where
+
+import           Dhall.Dep
+import           Test.Tasty
+import           Test.Tasty.HUnit
+
+main :: IO ()
+main = defaultMain $
+    testGroup "Dhall.Deps"
+        [ unitTest ]
+
+unitTest :: TestTree
+unitTest = testCase "test/data/expr2.dhall" $ do
+    res <- getAllFileDeps "test/data/expr2.dhall"
+    res @?= ["test/data/expr1.dhall", "test/data/expr0.dhall", "test/data/subdir/lib.dhall"]
