busser-bats 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 18630d2d9565f35fc8ff4775d029ad7f673f2b27
4
+ data.tar.gz: 595d8d03ac3def1fb0bb04a2d3da5a6552aac118
5
+ SHA512:
6
+ metadata.gz: 63d6b127a618ea52cb66ec622460f81de14f7f22381049e5ac9ef0b79cf23d7f10bde35e501d2d77f61de211a09b134d4c489c11eb7738a882e44271773bd68c
7
+ data.tar.gz: 94435202e166dae20daafaefcb08552fb74f324d017eb323b6ed0bc5d724c1c80a2a5da5de6814bba19ab24555ab233bf17cb8683f637446a830a31859029e9f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 0.2.0 / 2014-03-23
2
+
3
+ ### Improvements
4
+
5
+ * Vendor a copy of Bats locally (v0.3.1) to speed & simplify plugin installations. ([@fnichol][])
6
+
7
+
1
8
  ## 0.1.0 / 2013-04-10
2
9
 
3
10
  * Initial release
11
+
12
+ <!--- The following link definition list is generated by PimpMyChangelog --->
13
+ [@fnichol]: https://github.com/fnichol
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # <a name="title"></a> Busser::RunnerPlugin::Bats
2
2
 
3
- [![Build Status](https://travis-ci.org/fnichol/busser-bats.png?branch=master)](https://travis-ci.org/fnichol/busser-bats)
4
- [![Code Climate](https://codeclimate.com/github/fnichol/busser-bats.png)](https://codeclimate.com/github/fnichol/busser-bats)
3
+ [![Build Status](https://travis-ci.org/test-kitchen/busser-bats.png?branch=master)](https://travis-ci.org/test-kitchen/busser-bats)
4
+ [![Code Climate](https://codeclimate.com/github/test-kitchen/busser-bats.png)](https://codeclimate.com/github/test-kitchen/busser-bats)
5
5
 
6
6
  A Busser runner plugin for [Bats][bats_site]
7
7
 
@@ -36,6 +36,8 @@ Created and maintained by [Fletcher Nichol][author] (<fnichol@nichol.ca>)
36
36
 
37
37
  Apache 2.0 (see [LICENSE][license])
38
38
 
39
+ [Bats][bats_site] is released under an MIT-style license, copyright Sam Stephenson.
40
+
39
41
 
40
42
  [author]: https://github.com/fnichol
41
43
  [issues]: https://github.com/fnichol/busser-bats/issues
data/Rakefile CHANGED
@@ -1,8 +1,46 @@
1
1
  require "bundler/gem_tasks"
2
2
  require 'cucumber/rake/task'
3
3
  require 'cane/rake_task'
4
+ require 'open-uri'
4
5
  require 'tailor/rake_task'
5
6
 
7
+ namespace :bats do
8
+
9
+ version = ENV.fetch("BATS_VERSION", "v0.3.1")
10
+ url = "https://github.com/sstephenson/bats/archive/#{version}.tar.gz"
11
+ tarball = "tmp/bats-#{version}.tar.gz"
12
+ vendor = "vendor/bats"
13
+
14
+ desc "Vendors bats #{version} source code into gem codebase"
15
+ task :vendor => "#{vendor}/VERSION.txt"
16
+
17
+ directory File.dirname(tarball)
18
+ directory vendor
19
+
20
+ file tarball => File.dirname(tarball) do |t|
21
+ begin
22
+ src = open(url).binmode
23
+ dst = open(t.name, "wb")
24
+ IO.copy_stream(src, dst)
25
+ ensure
26
+ src.close
27
+ dst.close
28
+ end
29
+ end
30
+
31
+ file "#{vendor}/VERSION.txt" => [vendor, tarball] do |t|
32
+ abs_tarball = File.expand_path(tarball)
33
+ Dir.chdir(vendor) { sh "tar xzf #{abs_tarball} --strip-components=1" }
34
+ rm_rf "#{vendor}/test"
35
+ IO.write(t.name, url + "\n")
36
+ end
37
+
38
+ desc "Clean up a vendored bats in preparation for a new vendored version"
39
+ task :clean do
40
+ rm_rf [vendor, tarball]
41
+ end
42
+ end
43
+
6
44
  Cucumber::Rake::Task.new(:features) do |t|
7
45
  t.cucumber_opts = ['features', '-x', '--format progress']
8
46
  end
data/busser-bats.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['fnichol@nichol.ca']
11
11
  spec.description = %q{A Busser runner plugin for Bats}
12
12
  spec.summary = spec.description
13
- spec.homepage = 'https://github.com/fnichol/busser-bats'
13
+ spec.homepage = 'https://github.com/test-kitchen/busser-bats'
14
14
  spec.license = 'Apache 2.0'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -21,6 +21,6 @@ module Busser
21
21
  module Bats
22
22
 
23
23
  # Version string for the Bats Busser runner plugin
24
- VERSION = "0.1.0"
24
+ VERSION = "0.2.0"
25
25
  end
26
26
  end
@@ -17,7 +17,6 @@
17
17
  # limitations under the License.
18
18
 
19
19
  require 'pathname'
20
- require 'tmpdir'
21
20
 
22
21
  require 'busser/runner_plugin'
23
22
 
@@ -28,19 +27,10 @@ require 'busser/runner_plugin'
28
27
  class Busser::RunnerPlugin::Bats < Busser::RunnerPlugin::Base
29
28
 
30
29
  postinstall do
31
- tmp_root = Pathname.new(Dir.mktmpdir("bats"))
32
- tarball_url = "https://github.com/sstephenson/bats/archive/master.tar.gz"
33
- tarball_file = tmp_root.join("bats.tar.gz")
34
- extract_root = tmp_root.join("bats")
35
- dest_path = vendor_path("bats")
36
-
37
- empty_directory(extract_root)
38
- get(tarball_url, tarball_file)
39
- inside(extract_root) do
40
- run!(%{gunzip -c "#{tarball_file}" | tar xf - --strip-components=1})
41
- run!(%{./install.sh #{dest_path}})
30
+ inside(Pathname.new(__FILE__).dirname.join("../../../vendor/bats")) do
31
+ FileUtils.ln_sf("../libexec/bats", "bin/bats")
32
+ run!(%{./install.sh #{vendor_path("bats")}})
42
33
  end
43
- remove_dir(tmp_root)
44
34
  end
45
35
 
46
36
  def test
@@ -0,0 +1,3 @@
1
+ * text=auto
2
+ *.sh eol=lf
3
+ libexec/* eol=lf
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Sam Stephenson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,272 @@
1
+ # Bats: Bash Automated Testing System
2
+
3
+ Bats is a [TAP](http://testanything.org/)-compliant testing framework
4
+ for Bash. It provides a simple way to verify that the UNIX programs
5
+ you write behave as expected.
6
+
7
+ A Bats test file is a Bash script with special syntax for defining
8
+ test cases. Under the hood, each test case is just a function with a
9
+ description.
10
+
11
+ ```bash
12
+ #!/usr/bin/env bats
13
+
14
+ @test "addition using bc" {
15
+ result="$(echo 2+2 | bc)"
16
+ [ "$result" -eq 4 ]
17
+ }
18
+
19
+ @test "addition using dc" {
20
+ result="$(echo 2 2+p | dc)"
21
+ [ "$result" -eq 4 ]
22
+ }
23
+ ```
24
+
25
+ Bats is most useful when testing software written in Bash, but you can
26
+ use it to test any UNIX program.
27
+
28
+ Test cases consist of standard shell commands. Bats makes use of
29
+ Bash's `errexit` (`set -e`) option when running test cases. If every
30
+ command in the test case exits with a `0` status code (success), the
31
+ test passes. In this way, each line is an assertion of truth.
32
+
33
+ ## Running tests
34
+
35
+ To run your tests, invoke the `bats` interpreter with a path to a test
36
+ file. The file's test cases are run sequentially and in isolation. If
37
+ all the test cases pass, `bats` exits with a `0` status code. If there
38
+ are any failures, `bats` exits with a `1` status code.
39
+
40
+ When you run Bats from a terminal, you'll see output as each test is
41
+ performed, with a check-mark next to the test's name if it passes or
42
+ an "X" if it fails.
43
+
44
+ $ bats addition.bats
45
+ ✓ addition using bc
46
+ ✓ addition using dc
47
+
48
+ 2 tests, 0 failures
49
+
50
+ If Bats is not connected to a terminal—in other words, if you
51
+ run it from a continuous integration system or redirect its output to
52
+ a file—the results are displayed in human-readable, machine-parsable
53
+ [TAP format](http://testanything.org/wiki/index.php/TAP_specification#THE_TAP_FORMAT).
54
+ You can force TAP output from a terminal by invoking Bats with the
55
+ `--tap` option.
56
+
57
+ $ bats --tap addition.bats
58
+ 1..2
59
+ ok 1 addition using bc
60
+ ok 2 addition using dc
61
+
62
+ ### Test suites
63
+
64
+ You can invoke the `bats` interpreter with multiple test file
65
+ arguments, or with a path to a directory containing multiple `.bats`
66
+ files. Bats will run each test file individually and aggregate the
67
+ results. If any test case fails, `bats` exits with a `1` status code.
68
+
69
+ ## Writing tests
70
+
71
+ Each Bats test file is evaulated n+1 times, where _n_ is the number of
72
+ test cases in the file. The first run counts the number of test cases,
73
+ then iterates over the test cases and executes each one in its own
74
+ process.
75
+
76
+ For details about exactly how Bats evaluates test files, see [Bats
77
+ Evaluation Process](https://github.com/sstephenson/bats/wiki/Bats-Evaluation-Process)
78
+ on the wiki.
79
+
80
+ ### The _run_ helper
81
+
82
+ Many Bats tests need to run a command and then make assertions about
83
+ its exit status and output. Bats includes a `run` helper that invokes
84
+ its arguments as a command, saves the exit status and output into
85
+ special global variables, and then returns with a `0` status code so
86
+ you can continue to make assertions in your test case.
87
+
88
+ For example, let's say you're testing that the `foo` command, when
89
+ passed a nonexistent filename, exits with a `1` status code and prints
90
+ an error message.
91
+
92
+ ```bash
93
+ @test "invoking foo with a nonexistent file prints an error" {
94
+ run foo nonexistent_filename
95
+ [ "$status" -eq 1 ]
96
+ [ "$output" = "foo: no such file 'nonexistent_filename'" ]
97
+ }
98
+ ```
99
+
100
+ The `$status` variable contains the status code of the command, and
101
+ the `$output` variable contains the combined contents of the command's
102
+ standard output and standard error streams.
103
+
104
+ A third special variable, the `$lines` array, is available for easily
105
+ accessing individual lines of output. For example, if you want to test
106
+ that invoking `foo` without any arguments prints usage information on
107
+ the first line:
108
+
109
+ ```bash
110
+ @test "invoking foo without arguments prints usage" {
111
+ run foo
112
+ [ "$status" -eq 1 ]
113
+ [ "${lines[0]}" = "usage: foo <filename>" ]
114
+ }
115
+ ```
116
+
117
+ ### The _load_ command
118
+
119
+ You may want to share common code across multiple test files. Bats
120
+ includes a convenient `load` command for sourcing a Bash source file
121
+ relative to the location of the current test file. For example, if you
122
+ have a Bats test in `test/foo.bats`, the command
123
+
124
+ ```bash
125
+ load test_helper
126
+ ```
127
+
128
+ will source the script `test/test_helper.bash` in your test file. This
129
+ can be useful for sharing functions to set up your environment or load
130
+ fixtures.
131
+
132
+ ### The _skip_ command
133
+
134
+ Tests can be skipped by using the `skip` command at the point in a
135
+ test you wish to skip.
136
+
137
+ ```bash
138
+ @test "A test I don't want to execute for now" {
139
+ skip
140
+ run foo
141
+ [ "$status" -eq 0 ]
142
+ }
143
+ ```
144
+
145
+ Optionally, you may include a reason for skipping:
146
+
147
+ ```bash
148
+ @test "A test I don't want to execute for now" {
149
+ skip "This command will return zero soon, but not now"
150
+ run foo
151
+ [ "$status" -eq 0 ]
152
+ }
153
+ ```
154
+
155
+ Or you can skip conditionally:
156
+
157
+ ```bash
158
+ @test "A test which should run" {
159
+ if [ foo != bar ]; then
160
+ skip "foo isn't bar"
161
+ fi
162
+
163
+ run foo
164
+ [ "$status" -eq 0 ]
165
+ }
166
+ ```
167
+
168
+ ### Setup and teardown functions
169
+
170
+ You can define special `setup` and `teardown` functions which run
171
+ before and after each test case, respectively. Use these to load
172
+ fixtures, set up your environment, and clean up when you're done.
173
+
174
+ ### Code outside of test cases
175
+
176
+ You can include code in your test file outside of `@test` functions.
177
+ For example, this may be useful if you want to check for dependencies
178
+ and fail immediately if they're not present. However, any output that
179
+ you print in code outside of `@test`, `setup` or `teardown` functions
180
+ must be redirected to `stderr` (`>&2`). Otherwise, the output may
181
+ cause Bats to fail by polluting the TAP stream on `stdout`.
182
+
183
+ ### Special variables
184
+
185
+ There are several global variables you can use to introspect on Bats
186
+ tests:
187
+
188
+ * `$BATS_TEST_FILENAME` is the fully expanded path to the Bats test
189
+ file.
190
+ * `$BATS_TEST_DIRNAME` is the directory in which the Bats test file is
191
+ located.
192
+ * `$BATS_TEST_NAMES` is an array of function names for each test case.
193
+ * `$BATS_TEST_NAME` is the name of the function containing the current
194
+ test case.
195
+ * `$BATS_TEST_DESCRIPTION` is the description of the current test
196
+ case.
197
+ * `$BATS_TEST_NUMBER` is the (1-based) index of the current test case
198
+ in the test file.
199
+ * `$BATS_TMPDIR` is the location to a directory that may be used to
200
+ store temporary files.
201
+
202
+ ## Installing Bats from source
203
+
204
+ Check out a copy of the Bats repository. Then, either add the Bats
205
+ `bin` directory to your `$PATH`, or run the provided `install.sh`
206
+ command with the location to the prefix in which you want to install
207
+ Bats. For example, to install Bats into `/usr/local`,
208
+
209
+ $ git clone https://github.com/sstephenson/bats.git
210
+ $ cd bats
211
+ $ ./install.sh /usr/local
212
+
213
+ Note that you may need to run `install.sh` with `sudo` if you do not
214
+ have permission to write to the installation prefix.
215
+
216
+ ## Support
217
+
218
+ The Bats source code repository is [hosted on
219
+ GitHub](https://github.com/sstephenson/bats). There you can file bugs
220
+ on the issue tracker or submit tested pull requests for review.
221
+
222
+ For real-world examples from open-source projects using Bats, see
223
+ [Projects Using Bats](https://github.com/sstephenson/bats/wiki/Projects-Using-Bats)
224
+ on the wiki.
225
+
226
+ To learn how to set up your editor for Bats syntax highlighting, see
227
+ [Syntax Highlighting](https://github.com/sstephenson/bats/wiki/Syntax-Highlighting)
228
+ on the wiki.
229
+
230
+ ### Version history
231
+
232
+ *0.3.1* (October 28, 2013)
233
+
234
+ * Fixed an incompatibility with the pretty formatter in certain
235
+ environments such as tmux.
236
+ * Fixed a bug where the pretty formatter would crash if the first line
237
+ of a test file's output was invalid TAP.
238
+
239
+ *0.3.0* (October 21, 2013)
240
+
241
+ * Improved formatting for tests run from a terminal. Failing tests
242
+ are now colored in red, and the total number of failing tests is
243
+ displayed at the end of the test run. When Bats is not connected to
244
+ a terminal (e.g. in CI runs), or when invoked with the `--tap` flag,
245
+ output is displayed in standard TAP format.
246
+ * Added the ability to skip tests using the `skip` command.
247
+ * Added a message to failing test case output indicating the file and
248
+ line number of the statement that caused the test to fail.
249
+ * Added "ad-hoc" test suite support. You can now invoke `bats` with
250
+ multiple filename or directory arguments to run all the specified
251
+ tests in aggregate.
252
+ * Added support for test files with Windows line endings.
253
+ * Fixed regular expression warnings from certain versions of Bash.
254
+ * Fixed a bug running tests containing lines that begin with `-e`.
255
+
256
+ *0.2.0* (November 16, 2012)
257
+
258
+ * Added test suite support. The `bats` command accepts a directory
259
+ name containing multiple test files to be run in aggregate.
260
+ * Added the ability to count the number of test cases in a file or
261
+ suite by passing the `-c` flag to `bats`.
262
+ * Preprocessed sources are cached between test case runs in the same
263
+ file for better performance.
264
+
265
+ *0.1.0* (December 30, 2011)
266
+
267
+ * Initial public release.
268
+
269
+ ---
270
+
271
+ © 2013 Sam Stephenson. Bats is released under an MIT-style license;
272
+ see `LICENSE` for details.
@@ -0,0 +1 @@
1
+ https://github.com/sstephenson/bats/archive/v0.3.1.tar.gz
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ version() {
5
+ echo "Bats 0.3.1"
6
+ }
7
+
8
+ usage() {
9
+ version
10
+ echo "Usage: bats [-c] [-p | -t] <test> [<test> ...]"
11
+ }
12
+
13
+ help() {
14
+ usage
15
+ echo
16
+ echo " <test> is the path to a Bats test file, or the path to a directory"
17
+ echo " containing Bats test files."
18
+ echo
19
+ echo " -c, --count Count the number of test cases without running any tests"
20
+ echo " -h, --help Display this help message"
21
+ echo " -p, --pretty Show results in pretty format (default for terminals)"
22
+ echo " -t, --tap Show results in TAP format"
23
+ echo " -v, --version Display the version number"
24
+ echo
25
+ echo " For more information, see https://github.com/sstephenson/bats"
26
+ echo
27
+ }
28
+
29
+ resolve_link() {
30
+ $(type -p greadlink readlink | head -1) "$1"
31
+ }
32
+
33
+ abs_dirname() {
34
+ local cwd="$(pwd)"
35
+ local path="$1"
36
+
37
+ while [ -n "$path" ]; do
38
+ cd "${path%/*}"
39
+ local name="${path##*/}"
40
+ path="$(resolve_link "$name" || true)"
41
+ done
42
+
43
+ pwd
44
+ cd "$cwd"
45
+ }
46
+
47
+ expand_path() {
48
+ { cd "$(dirname "$1")" 2>/dev/null
49
+ local dirname="$PWD"
50
+ cd "$OLDPWD"
51
+ echo "$dirname/$(basename "$1")"
52
+ } || echo "$1"
53
+ }
54
+
55
+ BATS_LIBEXEC="$(abs_dirname "$0")"
56
+ export BATS_PREFIX="$(abs_dirname "$BATS_LIBEXEC")"
57
+ export PATH="$BATS_LIBEXEC:$PATH"
58
+
59
+ options=()
60
+ arguments=()
61
+ for arg in "$@"; do
62
+ if [ "${arg:0:1}" = "-" ]; then
63
+ if [ "${arg:1:1}" = "-" ]; then
64
+ options[${#options[*]}]="${arg:2}"
65
+ else
66
+ index=1
67
+ while option="${arg:$index:1}"; do
68
+ [ -n "$option" ] || break
69
+ options[${#options[*]}]="$option"
70
+ index=$(($index+1))
71
+ done
72
+ fi
73
+ else
74
+ arguments[${#arguments[*]}]="$arg"
75
+ fi
76
+ done
77
+
78
+ unset count_flag pretty
79
+ [ -t 0 ] && [ -t 1 ] && pretty="1"
80
+
81
+ for option in "${options[@]}"; do
82
+ case "$option" in
83
+ "h" | "help" )
84
+ help
85
+ exit 0
86
+ ;;
87
+ "v" | "version" )
88
+ version
89
+ exit 0
90
+ ;;
91
+ "c" | "count" )
92
+ count_flag="-c"
93
+ ;;
94
+ "t" | "tap" )
95
+ pretty=""
96
+ ;;
97
+ "p" | "pretty" )
98
+ pretty="1"
99
+ ;;
100
+ * )
101
+ usage >&2
102
+ exit 1
103
+ ;;
104
+ esac
105
+ done
106
+
107
+ if [ "${#arguments[@]}" -eq 0 ]; then
108
+ usage >&2
109
+ exit 1
110
+ fi
111
+
112
+ filenames=()
113
+ for filename in "${arguments[@]}"; do
114
+ if [ -d "$filename" ]; then
115
+ shopt -s nullglob
116
+ for suite_filename in "$(expand_path "$filename")"/*.bats; do
117
+ filenames["${#filenames[@]}"]="$suite_filename"
118
+ done
119
+ shopt -u nullglob
120
+ else
121
+ filenames["${#filenames[@]}"]="$(expand_path "$filename")"
122
+ fi
123
+ done
124
+
125
+ if [ "${#filenames[@]}" -eq 1 ]; then
126
+ command="bats-exec-test"
127
+ else
128
+ command="bats-exec-suite"
129
+ fi
130
+
131
+ if [ -n "$pretty" ]; then
132
+ extended_syntax_flag="-x"
133
+ formatter="bats-format-tap-stream"
134
+ else
135
+ extended_syntax_flag=""
136
+ formatter="cat"
137
+ fi
138
+
139
+ set -o pipefail execfail
140
+ exec "$command" $count_flag $extended_syntax_flag "${filenames[@]}" | "$formatter"