(#2067) Improve test coverage for managed dependencies

This commit adds some additional dependencies to the test project
file for managed dependencies, and significantly increases the
coverage of the tests.
This commit is contained in:
Chris Price 2016-06-22 14:24:38 -07:00
parent 867b667601
commit 54fda200d7
5 changed files with 80 additions and 17 deletions

View file

@ -531,6 +531,15 @@
:managed-dependencies)]
(apply resolve-managed-dependencies dependencies-key managed-dependencies-key project rest)))
(defn merge-versions-from-managed-coords
[deps managed-deps]
;; NOTE: there is a new function in the 0.3.1 release of pomegranate that
;; is needed here, but was accidentally marked as private. Calling it
;; via the symbol dereference for now, but this can be changed to a
;; regular function call once https://github.com/cemerick/pomegranate/pull/74
;; is merged.
(#'aether/merge-versions-from-managed-coords deps managed-deps))
(defn managed-dependency-hierarchy
"Returns a graph of the project's dependencies.
@ -538,12 +547,7 @@
versions to be specified from an alternate location in the project file, or
from a parent project file."
[dependencies-key managed-dependencies-key project & options]
;; NOTE: there is a new function in the 0.3.1 release of pomegranate that
;; is needed here, but was accidentally marked as private. Calling it
;; via the symbol dereference for now, but this can be changed to a
;; regular function call once https://github.com/cemerick/pomegranate/pull/74
;; is merged.
(if-let [deps-list (#'aether/merge-versions-from-managed-coords
(if-let [deps-list (merge-versions-from-managed-coords
(get project dependencies-key)
(get project managed-dependencies-key))]
(aether/dependency-hierarchy deps-list

View file

@ -2,13 +2,10 @@
"Download all dependencies."
(:require [leiningen.core.classpath :as classpath]
[leiningen.core.main :as main]
[leiningen.core.eval :as eval]
[leiningen.core.project :as project]
[leiningen.core.user :as user]
[leiningen.core.utils :as utils]
[cemerick.pomegranate.aether :as aether]
[clojure.pprint :as pp]
[clojure.java.io :as io])
[cemerick.pomegranate.aether :as aether])
(:import (org.sonatype.aether.resolution DependencyResolutionException)))
(defn- walk-deps

View file

@ -1,12 +1,14 @@
(ns leiningen.test.deps
(:use [clojure.test]
[leiningen.deps]
[leiningen.test.helper :only [sample-project m2-dir native-project
[leiningen.test.helper :only [sample-project m2-dir m2-file native-project
managed-deps-project
delete-file-recursively]])
(:require [clojure.java.io :as io]
[leiningen.core.utils :as utils]
[leiningen.core.eval :as eval]))
[leiningen.core.eval :as eval]
[leiningen.core.classpath :as classpath]
[cemerick.pomegranate.aether :as aether]))
(deftest ^:online test-deps
(let [sample-deps [["rome" "0.9"] ["jdom" "1.0"]]]
@ -128,10 +130,61 @@
native-project)))))]
(.getName f))))))
(defn coordinates-match?
[dep1 dep2]
;; NOTE: there is a new function in the 0.3.1 release of pomegranate that
;; is useful here, but it is private. Calling it via the symbol dereference
;; for now, but might consider making it public upstream. Haven't done so
;; yet since it is only used for tests.
(#'aether/coordinates-match? dep1 dep2))
(deftest ^:online test-managed-deps
(let [managed-deps [["rome" "0.9"] ["jdom" "1.0"]]]
(let [is-clojure-dep? #(#{'org.clojure/clojure
'org.clojure/tools.nrepl}
(first %))
remove-clojure-deps #(remove is-clojure-dep? %)
managed-deps (remove-clojure-deps (:managed-dependencies managed-deps-project))
;; find deps from normal "deps" section which explicitly specify their
;; version number rather than inheriting it from managed-deps
versioned-unmanaged-deps (filter
(fn [dep]
(and (> (count dep) 1)
(string? (nth dep 1))
(not (is-clojure-dep? dep))))
(:dependencies managed-deps-project))
;; the list of final, used deps w/versions
merged-deps (remove-clojure-deps
(classpath/merge-versions-from-managed-coords
(:dependencies managed-deps-project)
(:managed-dependencies managed-deps-project)))
;; the list of deps from the managed deps section that aren't used
unused-managed-deps (remove
(fn [dep]
(some (partial coordinates-match? dep) merged-deps))
managed-deps)
;; deps that have classifiers
classified-deps (filter
#(some #{:classifier} %)
merged-deps)]
;; make sure the sample data has some unmanaged deps, some unused managed deps,
;; and some classified deps, for completeness
(is (not (empty? versioned-unmanaged-deps)))
(is (not (empty? unused-managed-deps)))
(is (not (empty? classified-deps)))
;; delete all of the existing artifacts for merged deps
(doseq [[n v] merged-deps]
(delete-file-recursively (m2-dir n v) :silently))
;; delete all of the artifacts for the managed deps too
(doseq [[n v] managed-deps]
(delete-file-recursively (m2-dir n v) :silently))
(deps managed-deps-project)
(doseq [[n v] managed-deps]
(is (.exists (m2-dir n v)) (str n " was not downloaded.")))))
;; artifacts should be available for all merged deps
(doseq [[n v] merged-deps]
(is (.exists (m2-dir n v)) (str n " was not downloaded.")))
;; artifacts should *not* have been downloaded for unused managed deps
(doseq [[n v] unused-managed-deps]
(is (not (.exists (m2-dir n v))) (str n " was unexpectedly downloaded.")))
;; artifacts with classifiers should be available
(doseq [[n v _ classifier] classified-deps]
(let [f (m2-file n v classifier)]
(is (.exists f) (str f " was not downloaded."))))))

View file

@ -15,6 +15,9 @@
(io/file local-repo
(if (string? n) n (or (namespace n) (name n))) (name n) v))
(defn m2-file [n v classifier]
(io/file (m2-dir n v) (str (name n) "-" v "-" classifier ".jar")))
(defn read-test-project-with-user-profiles [name user-profiles]
(with-redefs [user/profiles (constantly user-profiles)]
(let [project (project/read (format "test_projects/%s/project.clj" name))]

View file

@ -5,8 +5,14 @@
:managed-dependencies [[~(symbol "org.clojure" "clojure") ~clj-version]
[rome ~(str "0." "9")]
[ring/ring "1.0.0"]]
[ring/ring "1.0.0"]
[ring/ring-codec "1.0.1"]
[commons-math/commons-math "1.2" :classifier "sources"]
[ring/ring-defaults "0.2.1"]]
:dependencies [[org.clojure/clojure]
[rome/rome nil]
[ring]])
[ring]
[ring/ring-codec nil :exclusions [commons-codec]]
[commons-codec "1.6"]
[commons-math nil :classifier "sources"]])