2 | 2 |
[clojure.java.io :only [file delete-file]]
|
3 | 3 |
[leiningen.pom :only [make-pom pom]]
|
4 | 4 |
[leiningen.core.user :as user]
|
5 | |
[leiningen.test.helper :only [sample-project]
|
|
5 |
[leiningen.test.helper
|
|
6 |
:only [sample-project sample-profile-meta-project]
|
6 | 7 |
:as lthelper])
|
7 | 8 |
(:require [clojure.data.xml :as xml]
|
8 | 9 |
[leiningen.core.project :as project]
|
|
31 | 32 |
(def first-in (comp first deep-content))
|
32 | 33 |
|
33 | 34 |
(defn with-profile [project name profile]
|
34 | |
(-> project
|
35 | |
(vary-meta update-in [:without-profiles :profiles]
|
36 | |
assoc name profile)
|
37 | |
(vary-meta update-in [:profiles]
|
38 | |
assoc name profile)))
|
39 | |
|
40 | |
(defn with-profile-merged [project profile]
|
41 | |
(project/merge-profiles (with-profile project :testy profile) [:testy]))
|
|
35 |
(let [profile (#'project/apply-profile-meta
|
|
36 |
(project/default-profile-metadata name)
|
|
37 |
profile)]
|
|
38 |
(-> project
|
|
39 |
(vary-meta update-in [:without-profiles :profiles]
|
|
40 |
assoc name profile)
|
|
41 |
(vary-meta update-in [:profiles]
|
|
42 |
assoc name profile))))
|
|
43 |
|
|
44 |
(defn with-profile-merged
|
|
45 |
([project profile]
|
|
46 |
(with-profile-merged project :testy profile))
|
|
47 |
([project name profile]
|
|
48 |
(project/merge-profiles (with-profile project name profile) [name])))
|
42 | 49 |
|
43 | 50 |
(deftest test-pom-default-values
|
44 | 51 |
(let [xml (xml/parse-str (make-pom sample-project))]
|
|
109 | 116 |
|
110 | 117 |
(deftest test-dependencies-are-test-scoped
|
111 | 118 |
(let [xml (xml/parse-str
|
112 | |
(make-pom (with-profile
|
113 | |
sample-project
|
114 | |
:test
|
115 | |
{:dependencies '[[peridot "0.0.5"]]})))]
|
116 | |
(is (= ["org.clojure" "rome" "ring" "peridot"
|
117 | |
"org.clojure" "clojure-complete"]
|
118 | |
(map #(first-in % [:dependency :groupId])
|
119 | |
(deep-content xml [:project :dependencies]))))
|
120 | |
(is (= ["clojure" "rome" "ring" "peridot" "tools.nrepl" "clojure-complete"]
|
121 | |
(map #(first-in % [:dependency :artifactId])
|
122 | |
(deep-content xml [:project :dependencies]))))
|
123 | |
(is (= ["1.3.0" "0.9" "1.0.0" "0.0.5" "0.2.5" "0.2.3"]
|
|
119 |
(make-pom (with-profile-merged
|
|
120 |
sample-project
|
|
121 |
:test {:dependencies '[[peridot "0.0.5"]]})))]
|
|
122 |
(is (= ["org.clojure" "rome" "ring"
|
|
123 |
"org.clojure" "clojure-complete" "peridot"]
|
|
124 |
(map #(first-in % [:dependency :groupId])
|
|
125 |
(deep-content xml [:project :dependencies]))))
|
|
126 |
(is (= ["clojure" "rome" "ring" "tools.nrepl" "clojure-complete" "peridot"]
|
|
127 |
(map #(first-in % [:dependency :artifactId])
|
|
128 |
(deep-content xml [:project :dependencies]))))
|
|
129 |
(is (= ["1.3.0" "0.9" "1.0.0" "0.2.5" "0.2.3" "0.0.5"]
|
124 | 130 |
(map #(first-in % [:dependency :version])
|
125 | 131 |
(deep-content xml [:project :dependencies]))))
|
126 | 132 |
(is (= [nil nil nil "test" "test" "test"]
|
|
129 | 135 |
|
130 | 136 |
(deftest dev-dependencies-are-test-scoped
|
131 | 137 |
(let [xml (xml/parse-str
|
132 | |
(make-pom (with-profile
|
|
138 |
(make-pom (with-profile-merged
|
133 | 139 |
sample-project
|
134 | 140 |
:dev
|
135 | 141 |
{:dependencies '[[peridot "0.0.5"]]})))]
|
136 | |
(is (= ["org.clojure" "rome" "ring" "peridot"
|
137 | |
"org.clojure" "clojure-complete"]
|
138 | |
(map #(first-in % [:dependency :groupId])
|
139 | |
(deep-content xml [:project :dependencies]))))
|
140 | |
(is (= ["clojure" "rome" "ring" "peridot" "tools.nrepl" "clojure-complete"]
|
141 | |
(map #(first-in % [:dependency :artifactId])
|
142 | |
(deep-content xml [:project :dependencies]))))
|
143 | |
(is (= ["1.3.0" "0.9" "1.0.0" "0.0.5" "0.2.5" "0.2.3"]
|
|
142 |
(is (= ["org.clojure" "rome" "ring"
|
|
143 |
"org.clojure" "clojure-complete" "peridot"]
|
|
144 |
(map #(first-in % [:dependency :groupId])
|
|
145 |
(deep-content xml [:project :dependencies]))))
|
|
146 |
(is (= ["clojure" "rome" "ring" "tools.nrepl" "clojure-complete" "peridot"]
|
|
147 |
(map #(first-in % [:dependency :artifactId])
|
|
148 |
(deep-content xml [:project :dependencies]))))
|
|
149 |
(is (= ["1.3.0" "0.9" "1.0.0" "0.2.5" "0.2.3" "0.0.5"]
|
144 | 150 |
(map #(first-in % [:dependency :version])
|
145 | 151 |
(deep-content xml [:project :dependencies]))))
|
146 | 152 |
(is (= [nil nil nil "test" "test" "test"]
|
|
149 | 155 |
|
150 | 156 |
(deftest provided-dependencies-are-provided-scoped
|
151 | 157 |
(let [xml (xml/parse-str
|
152 | |
(make-pom (with-profile
|
|
158 |
(make-pom (with-profile-merged
|
153 | 159 |
sample-project
|
154 | 160 |
:provided
|
155 | 161 |
{:dependencies '[[peridot "0.0.5"]]})))]
|
156 | |
(is (= ["org.clojure" "rome" "ring" "peridot"
|
157 | |
"org.clojure" "clojure-complete"]
|
158 | |
(map #(first-in % [:dependency :groupId])
|
159 | |
(deep-content xml [:project :dependencies]))))
|
160 | |
(is (= ["clojure" "rome" "ring" "peridot" "tools.nrepl" "clojure-complete"]
|
161 | |
(map #(first-in % [:dependency :artifactId])
|
162 | |
(deep-content xml [:project :dependencies]))))
|
163 | |
(is (= ["1.3.0" "0.9" "1.0.0" "0.0.5" "0.2.5" "0.2.3"]
|
164 | |
(map #(first-in % [:dependency :version])
|
165 | |
(deep-content xml [:project :dependencies]))))
|
166 | |
(is (= [nil nil nil "provided" "test" "test"]
|
|
162 |
(is (= ["org.clojure" "rome" "ring"
|
|
163 |
"org.clojure" "clojure-complete" "peridot"]
|
|
164 |
(map #(first-in % [:dependency :groupId])
|
|
165 |
(deep-content xml [:project :dependencies]))))
|
|
166 |
(is (= ["clojure" "rome" "ring" "tools.nrepl" "clojure-complete" "peridot"]
|
|
167 |
(map #(first-in % [:dependency :artifactId])
|
|
168 |
(deep-content xml [:project :dependencies]))))
|
|
169 |
(is (= ["1.3.0" "0.9" "1.0.0" "0.2.5" "0.2.3" "0.0.5"]
|
|
170 |
(map #(first-in % [:dependency :version])
|
|
171 |
(deep-content xml [:project :dependencies]))))
|
|
172 |
(is (= [nil nil nil "test" "test" "provided"]
|
167 | 173 |
(map #(first-in % [:dependency :scope])
|
168 | 174 |
(deep-content xml [:project :dependencies]))))))
|
169 | 175 |
|
|
171 | 177 |
(let [xml (xml/parse-str
|
172 | 178 |
(make-pom (with-profile-merged
|
173 | 179 |
sample-project
|
174 | |
{:dependencies '[[peridot "0.0.5"
|
175 | |
:scope "provided"
|
176 | |
:optional true
|
177 | |
:classifier "sources"
|
178 | |
:extension "pom"
|
179 | |
:exclusions
|
180 | |
[[ring-mock
|
181 | |
:classifier "cla"
|
182 | |
:extension "dom"]]]]})))]
|
183 | |
(is (= ["org.clojure" "rome" "ring" "peridot"
|
184 | |
"org.clojure" "clojure-complete"]
|
185 | |
(map #(first-in % [:dependency :groupId])
|
186 | |
(deep-content xml [:project :dependencies]))))
|
187 | |
(is (= ["clojure" "rome" "ring" "peridot"
|
188 | |
"tools.nrepl" "clojure-complete"]
|
189 | |
(map #(first-in % [:dependency :artifactId])
|
190 | |
(deep-content xml [:project :dependencies]))))
|
191 | |
(is (= ["1.3.0" "0.9" "1.0.0" "0.0.5" "0.2.5" "0.2.3"]
|
192 | |
(map #(first-in % [:dependency :version])
|
193 | |
(deep-content xml [:project :dependencies]))))
|
194 | |
(is (= [nil nil nil "provided" "test" "test"]
|
195 | |
(map #(first-in % [:dependency :scope])
|
196 | |
(deep-content xml [:project :dependencies]))))
|
197 | |
(is (= [nil nil nil "true" nil nil]
|
|
180 |
^:leaky {:dependencies '[[peridot "0.0.5"
|
|
181 |
:scope "provided"
|
|
182 |
:optional true
|
|
183 |
:classifier "sources"
|
|
184 |
:extension "pom"
|
|
185 |
:exclusions
|
|
186 |
[[ring-mock
|
|
187 |
:classifier "cla"
|
|
188 |
:extension "dom"]]]]})))]
|
|
189 |
(is (= ["org.clojure" "rome" "ring"
|
|
190 |
"org.clojure" "clojure-complete" "peridot"]
|
|
191 |
(map #(first-in % [:dependency :groupId])
|
|
192 |
(deep-content xml [:project :dependencies]))))
|
|
193 |
(is (= ["clojure" "rome" "ring"
|
|
194 |
"tools.nrepl" "clojure-complete" "peridot"]
|
|
195 |
(map #(first-in % [:dependency :artifactId])
|
|
196 |
(deep-content xml [:project :dependencies]))))
|
|
197 |
(is (= ["1.3.0" "0.9" "1.0.0" "0.2.5" "0.2.3" "0.0.5"]
|
|
198 |
(map #(first-in % [:dependency :version])
|
|
199 |
(deep-content xml [:project :dependencies]))))
|
|
200 |
(is (= [nil nil nil "test" "test" "provided"]
|
|
201 |
(map #(first-in % [:dependency :scope])
|
|
202 |
(deep-content xml [:project :dependencies]))))
|
|
203 |
(is (= [nil nil nil nil nil "true"]
|
198 | 204 |
(map #(first-in % [:dependency :optional])
|
199 | 205 |
(deep-content xml [:project :dependencies]))))
|
200 | |
(is (= [nil nil nil "sources" nil nil]
|
|
206 |
(is (= [nil nil nil nil nil "sources"]
|
201 | 207 |
(map #(first-in % [:dependency :classifier])
|
202 | 208 |
(deep-content xml [:project :dependencies]))))
|
203 | |
(is (= [nil nil nil "pom" nil nil]
|
|
209 |
(is (= [nil nil nil nil nil "pom"]
|
204 | 210 |
(map #(first-in % [:dependency :type])
|
205 | 211 |
(deep-content xml [:project :dependencies]))))
|
206 | |
(is (= [nil nil nil "ring-mock" "clojure" "clojure"]
|
|
212 |
(is (= [nil nil nil "clojure" "clojure" "ring-mock"]
|
207 | 213 |
(map #(first-in % [:dependency :exclusions :exclusion :artifactId])
|
208 | 214 |
(deep-content xml [:project :dependencies]))))
|
209 | |
(is (= [nil nil nil "ring-mock" "org.clojure" "org.clojure"]
|
|
215 |
(is (= [nil nil nil "org.clojure" "org.clojure" "ring-mock"]
|
210 | 216 |
(map #(first-in % [:dependency :exclusions :exclusion :groupId])
|
211 | 217 |
(deep-content xml [:project :dependencies]))))
|
212 | |
(is (= [nil nil nil "cla" nil nil]
|
|
218 |
(is (= [nil nil nil nil nil "cla"]
|
213 | 219 |
(map #(first-in % [:dependency :exclusions :exclusion :classifier])
|
214 | 220 |
(deep-content xml [:project :dependencies]))))
|
215 | |
(is (= [nil nil nil "dom" nil nil]
|
|
221 |
(is (= [nil nil nil nil nil "dom"]
|
216 | 222 |
(map #(first-in % [:dependency :exclusions :exclusion :type])
|
217 | 223 |
(deep-content xml [:project :dependencies])))))
|
218 | 224 |
(let [xml (xml/parse-str
|
219 | 225 |
(make-pom (with-profile-merged
|
220 | 226 |
sample-project
|
221 | |
{:dependencies '[[peridot "0.0.5"
|
222 | |
:scope "provided"
|
223 | |
:exclusions
|
224 | |
[ring-mock]]]})))]
|
225 | |
(is (= ["org.clojure" "rome" "ring" "peridot"
|
226 | |
"org.clojure" "clojure-complete"]
|
227 | |
(map #(first-in % [:dependency :groupId])
|
228 | |
(deep-content xml [:project :dependencies]))))
|
229 | |
(is (= ["clojure" "rome" "ring" "peridot" "tools.nrepl" "clojure-complete"]
|
230 | |
(map #(first-in % [:dependency :artifactId])
|
231 | |
(deep-content xml [:project :dependencies]))))
|
232 | |
(is (= ["1.3.0" "0.9" "1.0.0" "0.0.5" "0.2.5" "0.2.3"]
|
233 | |
(map #(first-in % [:dependency :version])
|
234 | |
(deep-content xml [:project :dependencies]))))
|
235 | |
(is (= [nil nil nil "provided" "test" "test"]
|
236 | |
(map #(first-in % [:dependency :scope])
|
237 | |
(deep-content xml [:project :dependencies]))))
|
238 | |
(is (= [nil nil nil "ring-mock" "clojure" "clojure"]
|
|
227 |
^:leaky {:dependencies '[[peridot "0.0.5"
|
|
228 |
:scope "provided"
|
|
229 |
:exclusions
|
|
230 |
[ring-mock]]]})))]
|
|
231 |
(is (= ["org.clojure" "rome" "ring"
|
|
232 |
"org.clojure" "clojure-complete" "peridot"]
|
|
233 |
(map #(first-in % [:dependency :groupId])
|
|
234 |
(deep-content xml [:project :dependencies]))))
|
|
235 |
(is (= ["clojure" "rome" "ring" "tools.nrepl" "clojure-complete" "peridot"]
|
|
236 |
(map #(first-in % [:dependency :artifactId])
|
|
237 |
(deep-content xml [:project :dependencies]))))
|
|
238 |
(is (= ["1.3.0" "0.9" "1.0.0" "0.2.5" "0.2.3" "0.0.5"]
|
|
239 |
(map #(first-in % [:dependency :version])
|
|
240 |
(deep-content xml [:project :dependencies]))))
|
|
241 |
(is (= [nil nil nil "test" "test" "provided"]
|
|
242 |
(map #(first-in % [:dependency :scope])
|
|
243 |
(deep-content xml [:project :dependencies]))))
|
|
244 |
(is (= [nil nil nil "clojure" "clojure" "ring-mock"]
|
239 | 245 |
(map #(first-in % [:dependency :exclusions :exclusion :artifactId])
|
240 | 246 |
(deep-content xml [:project :dependencies]))))
|
241 | 247 |
(is (= [nil nil nil nil nil nil]
|
|
247 | 253 |
|
248 | 254 |
(deftest dependencies-are-required-when-overlapped-by-builtin-profiles
|
249 | 255 |
(let [xml (xml/parse-str
|
250 | |
(make-pom (with-profile sample-project
|
|
256 |
(make-pom (with-profile-merged
|
|
257 |
sample-project
|
251 | 258 |
:dev {:dependencies '[[rome "0.8"]]})))]
|
252 | |
(is (= ["org.clojure" "rome" "ring" "rome" "org.clojure" "clojure-complete"]
|
253 | |
(map #(first-in % [:dependency :groupId])
|
254 | |
(deep-content xml [:project :dependencies]))))
|
255 | |
(is (= ["clojure" "rome" "ring" "rome" "tools.nrepl" "clojure-complete"]
|
256 | |
(map #(first-in % [:dependency :artifactId])
|
257 | |
(deep-content xml [:project :dependencies]))))
|
258 | |
(is (= ["1.3.0" "0.9" "1.0.0" "0.8" "0.2.5" "0.2.3"]
|
259 | |
(map #(first-in % [:dependency :version])
|
260 | |
(deep-content xml [:project :dependencies]))))
|
261 | |
(is (= [nil nil nil "test" "test" "test"]
|
|
259 |
(is (= ["org.clojure" "rome" "ring" "org.clojure" "clojure-complete"]
|
|
260 |
(map #(first-in % [:dependency :groupId])
|
|
261 |
(deep-content xml [:project :dependencies]))))
|
|
262 |
(is (= ["clojure" "rome" "ring" "tools.nrepl" "clojure-complete"]
|
|
263 |
(map #(first-in % [:dependency :artifactId])
|
|
264 |
(deep-content xml [:project :dependencies]))))
|
|
265 |
(is (= ["1.3.0" "0.8" "1.0.0" "0.2.5" "0.2.3"]
|
|
266 |
(map #(first-in % [:dependency :version])
|
|
267 |
(deep-content xml [:project :dependencies]))))
|
|
268 |
(is (= [nil "test" nil "test" "test"]
|
262 | 269 |
(map #(first-in % [:dependency :scope])
|
263 | 270 |
(deep-content xml [:project :dependencies]))))))
|
264 | 271 |
|
|
268 | 275 |
(is (= "stuff"
|
269 | 276 |
(-> (make-pom (with-profile-merged
|
270 | 277 |
sample-project
|
271 | |
{:classifier "stuff"}))
|
|
278 |
^:leaky {:classifier "stuff"}))
|
272 | 279 |
xml/parse-str
|
273 | 280 |
(first-in [:project :classifier])))))
|
274 | 281 |
|
275 | 282 |
(deftest test-pom-adds-java-source-paths
|
276 | 283 |
(is (= (vec (map lthelper/fix-path-delimiters ["java/src" "java/another"]))
|
277 | 284 |
(-> (make-pom (with-profile-merged sample-project
|
|
285 |
^:leaky
|
278 | 286 |
{:java-source-paths ["java/src" "java/another"]}))
|
279 | 287 |
xml/parse-str
|
280 | 288 |
(deep-content [:project :build :plugins :plugin :executions
|
|
284 | 292 |
(deftest test-pom-handles-global-exclusions
|
285 | 293 |
(is (= [["clojure"] ["clojure"] ["clojure"] ["clojure"] ["clojure"]]
|
286 | 294 |
(-> (make-pom (with-profile-merged sample-project
|
287 | |
{:exclusions '[org.clojure/clojure]}))
|
|
295 |
^:leaky {:exclusions '[org.clojure/clojure]}))
|
288 | 296 |
xml/parse-str
|
289 | 297 |
(deep-content [:project :dependencies])
|
290 | 298 |
((partial map #(deep-content % [:dependency :exclusions])))
|
|
312 | 320 |
[artifact (first-in dep [:dependency :classifier])])))))
|
313 | 321 |
|
314 | 322 |
(deftest test-override-base-profile
|
315 | |
(let [p (make-pom (with-profile-merged sample-project
|
316 | |
{:dependencies [['org.clojure/tools.nrepl "0.2.2"]]}))
|
|
323 |
(testing "leaky explicit profile"
|
|
324 |
(let [p (make-pom (with-profile-merged sample-project
|
|
325 |
^:leaky
|
|
326 |
{:dependencies [['org.clojure/tools.nrepl "0.2.2"]]}))
|
|
327 |
deps (deep-content (xml/parse-str p) [:project :dependencies])
|
|
328 |
nrepls (filter #(re-find #"nrepl" (pr-str %)) deps)
|
|
329 |
versions (map #(deep-content % [:dependency :version]) nrepls)]
|
|
330 |
(is (= [["0.2.2"]] versions))))
|
|
331 |
(testing "pom-scope"
|
|
332 |
(let [p (make-pom (with-profile-merged sample-project
|
|
333 |
^{:pom-scope :test}
|
|
334 |
{:dependencies [['org.clojure/tools.nrepl "0.2.2"]]}))
|
|
335 |
deps (deep-content (xml/parse-str p) [:project :dependencies])
|
|
336 |
nrepls (filter #(re-find #"nrepl" (pr-str %)) deps)
|
|
337 |
versions (map #(deep-content % [:dependency :version]) nrepls)]
|
|
338 |
(is (= [["0.2.2"]] versions)))))
|
|
339 |
|
|
340 |
(deftest test-leaky-profile
|
|
341 |
(let [p (make-pom sample-profile-meta-project)
|
317 | 342 |
deps (deep-content (xml/parse-str p) [:project :dependencies])
|
318 | |
nrepls (filter #(re-find #"nrepl" (pr-str %)) deps)
|
319 | |
versions (map #(deep-content % [:dependency :version]) nrepls)]
|
320 | |
(is (= [["0.2.2"]] versions))))
|
|
343 |
t-m (filter #(re-find #"tools.macro" (pr-str %)) deps)
|
|
344 |
j-c (filter #(re-find #"java.classpath" (pr-str %)) deps)
|
|
345 |
t-n (filter #(re-find #"tools.namespace" (pr-str %)) deps)]
|
|
346 |
(is (= [["0.1.2"]] (map #(deep-content % [:dependency :version]) t-m)))
|
|
347 |
(is (= [["0.2.2"]] (map #(deep-content % [:dependency :version]) j-c)))
|
|
348 |
(is (= [["0.2.6"]] (map #(deep-content % [:dependency :version]) t-n)))
|
|
349 |
(is (= [nil] (map #(deep-content % [:dependency :scope]) t-m)))
|
|
350 |
(is (= [["test"]] (map #(deep-content % [:dependency :scope]) j-c)))
|
|
351 |
(is (= [["provided"]] (map #(deep-content % [:dependency :scope]) t-n)))))
|