git » blacktide.git » master » tree

[master] / test / com / tailrecursion / blacktide / package_test.clj

(ns com.tailrecursion.blacktide.package-test
  "A release built from a working checkout must exclude nested editor caches."
  (:require [clojure.test :refer [deftest is]]
            [clojure.java.io :as io]
            [clojure.java.shell :as shell]))

(deftest jar-excludes-editor-state
  (let [directory (.toFile (java.nio.file.Files/createTempDirectory "blacktide-package-"
                            (make-array java.nio.file.attribute.FileAttribute 0)))
        write! (fn [path value]
                 (let [file (io/file directory path)] (io/make-parents file) (spit file value)))]
    (try
      (doseq [root ["deps.edn" "build.clj" "LICENSE" "src"]
              file (file-seq (io/file root)) :when (.isFile file)]
        (let [target (io/file directory (.getPath file))]
          (io/make-parents target) (io/copy file target)))
      (write! "src/com/tailrecursion/.clj-kondo/hooks.clj" "(ns private-editor-hook)")
      (write! "src/com/tailrecursion/blacktide/.lsp/cache.json" "private editor state")
      (write! "resources/application.edn" "{:library-resource true}")
      (write! "target/classes/stale.class" "unrelated build output")
      (let [java (str (io/file (System/getProperty "java.home") "bin" "java"))
            result (shell/sh "clojure" "-T:build" "jar" :dir directory
                             :env (assoc (into {} (System/getenv)) "JAVA_CMD" java))]
        (is (zero? (:exit result)) (str (:out result) (:err result)))
        (when (zero? (:exit result))
          (with-open [jar (java.util.jar.JarFile. (io/file directory "target/blacktide-0.1.0-SNAPSHOT.jar"))]
            (let [names (set (map #(.getName ^java.util.jar.JarEntry %) (enumeration-seq (.entries jar))))]
              (is (not-any? #(re-find #"(?:^|/)\." %) names))
              (is (every? names ["com/tailrecursion/blacktide.clj" "META-INF/LICENSE" "application.edn"]))
              (is (not-any? #(.endsWith ^String % ".class") names))
              (is (not-any? #(re-find #"(?:^|/)(?:test|tools|examples)/" %) names))))))
      (finally (doseq [file (reverse (file-seq directory))] (io/delete-file file))))))