(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))))))