Skip to content

Commit

Permalink
Use circleci.test reporter instead of monkey patching clojure.test.
Browse files Browse the repository at this point in the history
It also adds support for test.check tests.

See https://github.com/leafclick/circleci.test.teamcity
  • Loading branch information
katox committed Jan 17, 2018
1 parent 9bce8a8 commit 0b1e11b
Show file tree
Hide file tree
Showing 25 changed files with 282 additions and 101 deletions.
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Change Log
All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/).

## [Unreleased]

## v0.3.0 - 2018-01-17

- Forked from [nd/lein-teamcity](https://github.com/nd/lein-teamcity) 0.2.2 plugin.
- Changed to test reporting based on [circleci.test](https://github.com/circleci/circleci.test) runner instead
of monkey patching `clojure.test`.
- Added support for `test.check` tests introduced with Clojure 1.9.

[Unreleased]: https://github.com/leafclick/lein-teamcity/compare/v0.3.0...HEAD
20 changes: 16 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# lein-teamcity
# com.leafclick/lein-teamcity

A Leiningen plugin for on-the-fly stages, tests and artifacts
reporting in TeamCity.
Expand All @@ -9,10 +9,22 @@ create a template at `~/.lein/profiles.d/teamcity.clj` with the
following content:

{
:plugins [[lein-teamcity "0.2.2"]]
:monkeypatch-clojure-test false
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]
:dependencies [[com.leafclick/circleci.test.teamcity "0.1.0"]]
:resource-paths #=(eval [(str (System/getProperty "user.home") "/.lein/profiles.d/teamcity-resources")])
}

create file `~/.lein/profiles.d/teamcity-resources/circleci_test/config.clj` with the following content:

(require '[com.leafclick.circleci.test.teamcity])
{:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}

Enable the following set of Leiningen aliases in `user` profile or `project.clj`

:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]
"tests" ["run" "-m" "circleci.test"]
"retest" ["run" "-m" "circleci.test.retest"]}

and run `lein with-profile +teamcity do clean, test, jar`.

Tests reporting requires leiningen 2.3.1+.
Tests reporting requires leiningen 2.4.0+.
5 changes: 3 additions & 2 deletions project.clj
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
(defproject lein-teamcity "0.2.2"
(defproject com.leafclick/lein-teamcity "0.3.0"
:description "Leiningen TeamCity integration"
:url "http://github.com/nd/lein-teamcity"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[robert/hooke "1.3.0"]]
:dependencies [[robert/hooke "1.3.0"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:eval-in-leiningen true)
63 changes: 8 additions & 55 deletions src/lein_teamcity/plugin.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,18 @@
[leiningen.uberjar]
[clojure.test]
[leiningen.core.main]
[leiningen.core.eval]
[leiningen.core.project :as project]
[clojure.string :as str]))

(defn escape
[s]
(str/replace s #"['|\n\r\[\]]"
(fn [x]
(cond (= x "\n") "|n"
(= x "\r") "|r"
:else (str "|" x)))))
(when s
(str/replace s #"['|\n\r\[\]]"
(fn [x]
(cond (= x "\n") "|n"
(= x "\r") "|r"
:else (str "|" x))))))

(defn tc-msg-attrs
[attrs]
Expand All @@ -35,64 +37,15 @@

(defn add-teamcity-uberjar-artifact-reporting [f & args]
(let [artifact (apply f args)]
(println (tc-msg :publishArtifacts artifact))))
(println (tc-msg :publishArtifacts artifact))))

(defn add-teamcity-task-reporting [f & [name :as args]]
(println (tc-msg :blockOpened :name name))
(apply f args)
(println (tc-msg :blockClosed :name name)))

(defn add-teamcity-test-reporting [f & args]
(if (boolean (resolve 'leiningen.test/*monkeypatch?*))
`(binding [~'clojure.test/report
(fn [m#]
(let [test-name#
(fn []
(let [names# (reverse (map #(:name (meta %)) clojure.test/*testing-vars*))]
(if (= (count names#) 1)
(str (first names#))
(str names#))))
fail-msg#
(fn [event#]
(str (if (:message event#) (str :message " " (:message event#) "\n") "")
:expected " " (:expected event#) "\n"
:actual " " (:actual event#)))
escape#
(fn [s#]
(-> s#
(.replaceAll "\\|" "||")
(.replaceAll "'" "|'")
(.replaceAll "\n" "|n")
(.replaceAll "\r" "|r")
(.replaceAll "\\[" "|[")
(.replaceAll "\\]" "|]")))]

(when (= (:type m#) :begin-test-ns)
(println (str "##teamcity[testSuiteStarted name='" (ns-name (:ns m#)) "']"))
((.getRawRoot #'clojure.test/report) m#))

(when (= (:type m#) :end-test-ns)
((.getRawRoot #'clojure.test/report) m#)
(println (str "##teamcity[testSuiteFinished name='" (ns-name (:ns m#)) "']")))

(when (= (:type m#) :begin-test-var)
(println (str "##teamcity[testStarted name='" (test-name#) "' captureStandardOutput='true']"))
((.getRawRoot #'clojure.test/report) m#))

(when (= (:type m#) :end-test-var)
((.getRawRoot #'clojure.test/report) m#)
(println (str "##teamcity[testFinished name='" (test-name#) "']")))

(when (#{:fail :error} (:type m#))
((.getRawRoot #'clojure.test/report) m#)
(println (str "##teamcity[testFailed name='" (test-name#) "' message='" (escape# (fail-msg# m#)) "']")))))]
~(apply f args))
(apply f args)))

(defn hooks []
(do
(robert.hooke/add-hook #'leiningen.test/form-for-testing-namespaces
add-teamcity-test-reporting)
(robert.hooke/add-hook #'leiningen.jar/write-jar
add-teamcity-jar-artifact-reporting)
(robert.hooke/add-hook #'leiningen.uberjar/uberjar
Expand Down
2 changes: 2 additions & 0 deletions test-projects/all-pass/dev-resources/circleci_test/config.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
(require '[com.leafclick.circleci.test.teamcity])
{:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}
7 changes: 4 additions & 3 deletions test-projects/all-pass/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:plugins [[lein-teamcity "0.2.1"]]
:monkeypatch-clojure-test false)
:dependencies [[org.clojure/clojure "1.5.1"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]
:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]})
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
(require '[com.leafclick.circleci.test.teamcity])
{:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}
7 changes: 4 additions & 3 deletions test-projects/one-error/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:plugins [[lein-teamcity "0.2.1"]]
:monkeypatch-clojure-test false)
:dependencies [[org.clojure/clojure "1.5.1"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]
:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]})
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
(require '[com.leafclick.circleci.test.teamcity])
{:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}
7 changes: 4 additions & 3 deletions test-projects/one-failure/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:plugins [[lein-teamcity "0.2.1"]]
:monkeypatch-clojure-test false)
:dependencies [[org.clojure/clojure "1.5.1"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]
:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]})
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
(require '[com.leafclick.circleci.test.teamcity])
{:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}
7 changes: 4 additions & 3 deletions test-projects/syntax-error-test/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:plugins [[lein-teamcity "0.2.1"]]
:monkeypatch-clojure-test false)
:dependencies [[org.clojure/clojure "1.5.1"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]
:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]})
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
(require '[com.leafclick.circleci.test.teamcity])
{:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}
7 changes: 4 additions & 3 deletions test-projects/syntax-error/project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:plugins [[lein-teamcity "0.2.1"]]
:monkeypatch-clojure-test false)
:dependencies [[org.clojure/clojure "1.5.1"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]
:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]})
9 changes: 9 additions & 0 deletions test-projects/test-check-all-pass/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/target
/classes
/checkouts
pom.xml
pom.xml.asc
*.jar
*.class
/.lein-*
/.nrepl-port
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
(require '[com.leafclick.circleci.test.teamcity])
{:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}
12 changes: 12 additions & 0 deletions test-projects/test-check-all-pass/project.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
(defproject test-check-all-pass "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.9.0"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]

:profiles {:dev {:dependencies [[org.clojure/test.check "0.9.0"]]}}

:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]})
12 changes: 12 additions & 0 deletions test-projects/test-check-all-pass/src/test_check_all_pass/core.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
(ns test-check-all-pass.core
(:require [clojure.test :refer :all]
[clojure.test.check :as tc]
[clojure.test.check.properties :as prop]))

(defn encrypt
"I encrypt very hard."
[x _k] x)

(defn decrypt
"I decrypt very hard."
[x _k] x)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
(ns test-check-all-pass.core-test
(:require [clojure.test :refer :all]
[clojure.test.check :as tc]
[clojure.spec.gen.alpha :as gen]
[clojure.spec.test.alpha :as stest]
[clojure.test.check.properties :as prop]
[test-check-all-pass.core :refer :all]))

(defmacro is-ok?
[result]
`(if (true? ~result)
(is ~result)
(is (= {} (ex-data ~result)))))


(deftest crypto-should-roundtrip
(testing "d(e(x,k),k) = x"
(is (:result
(tc/quick-check 10
(prop/for-all [message (gen/string)
user-key (gen/string)]
(= message (decrypt (encrypt message user-key) user-key))))))))
9 changes: 9 additions & 0 deletions test-projects/test-check-failure/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/target
/classes
/checkouts
pom.xml
pom.xml.asc
*.jar
*.class
/.lein-*
/.nrepl-port
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
(require '[com.leafclick.circleci.test.teamcity])

{:test-results-dir "target/test-results"
:reporters [com.leafclick.circleci.test.teamcity/teamcity-reporter]}
12 changes: 12 additions & 0 deletions test-projects/test-check-failure/project.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
(defproject test-check-failure "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.9.0"]
[com.leafclick/circleci.test.teamcity "0.1.0"]]
:plugins [[com.leafclick/lein-teamcity "0.3.0"]]

:profiles {:dev {:dependencies [[org.clojure/test.check "0.9.0"]]}}

:aliases {"test" ["run" "-m" "circleci.test/dir" :project/test-paths]})
12 changes: 12 additions & 0 deletions test-projects/test-check-failure/src/test_check_failure/core.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
(ns test-check-failure.core
(:require [clojure.test :refer :all]
[clojure.test.check :as tc]
[clojure.test.check.properties :as prop]))

(defn encrypt
"I encrypt very hard."
[x _k] x)

(defn decrypt
"I decrypt very hard."
[x _k] x)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
(ns test-check-failure.core-test
(:require [clojure.test :refer :all]
[clojure.test.check :as tc]
[clojure.spec.gen.alpha :as gen]
[clojure.spec.test.alpha :as stest]
[clojure.test.check.properties :as prop]
[test-check-failure.core :refer :all]))

(defmacro is-ok?
[result]
`(if (true? ~result)
(is ~result)
(is (= {} (ex-data ~result)))))


(deftest crypto-should-roundtrip
(testing "m != e(m)"
(is (:result
(tc/quick-check 10
(prop/for-all [message (gen/string)
user-key (gen/string)]
(not= message (encrypt message user-key) user-key)))))))

0 comments on commit 0b1e11b

Please sign in to comment.