ghostbuster 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ghostbuster
2
2
 
3
- Automated browser testing via phantom.js, with all of the pain taken out!
3
+ Automated browser testing via phantom.js, with all of the pain taken out! That means you get a *real browser*, with a *real DOM*, and can do *real testing*!
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,7 +8,7 @@ To install first `gem install ghostbuster`. Once you've done that, you can run `
8
8
 
9
9
  ## Usage
10
10
 
11
- Once installed, you can simply use `ghostbuster path/to/tests` to run your tests. You should get some output that looks something liek this.
11
+ Once installed, you can simply use `ghostbuster path/to/tests` to run your tests. You should get some output that looks something like this.
12
12
 
13
13
  ~~~~
14
14
 
@@ -70,11 +70,12 @@ The closures passed for matching have access to the real DOM node, however, they
70
70
 
71
71
  ## Before and after
72
72
 
73
- You can add an arbitrary number of before and after blocks to be run within the context of your test. Simple call `before` and `after` on your test to add them.
73
+ You can add an arbitrary number of before and after blocks to be run within the context of your test. Simply call `before` and `after` on your test to add them. You have to call @succeed in the before block to continue processing your test.
74
74
 
75
75
  ~~~~
76
76
  phantom.test.before ->
77
77
  # do some setup
78
+ @succeed()
78
79
 
79
80
  phantom.test.after ->
80
81
  # do some teardown
@@ -16,6 +16,8 @@ when /darwin/
16
16
  puts "Downloading and install phantom.js"
17
17
  system("curl #{phantom_url} -O") or raise("Unable to download from #{phantom_url}")
18
18
  system("open #{File.basename(phantom_url)}") or raise("Unable to open disk image")
19
+ puts("Giving time to mount the image...")
20
+ system("sleep 4")
19
21
  end
20
22
  system("cp -r /Volumes/phantomjs/phantomjs.app #{root}")
21
23
  File.exist?("#{root}/phantomjs.app") or raise("Unable to copy phantomjs from your disk image")
@@ -2,6 +2,7 @@ phantom.test.root = "http://127.0.0.1:4567"
2
2
 
3
3
  phantom.test.before ->
4
4
  @var = 'sample'
5
+ @succeed()
5
6
 
6
7
  phantom.test.add "Simple form", ->
7
8
  @get '/form', ->
@@ -19,8 +19,11 @@ class Test
19
19
  waiting = ->
20
20
  test.waitForAssertions(whenDone)
21
21
  setTimeout waiting, 10
22
- run: (@callback) ->
23
- @testBody.call(this)
22
+ actuallyRun: -> true
23
+ run: (callback) ->
24
+ @runWithFunction(@testBody, callback)
25
+ runWithFunction: (fn, @callback) ->
26
+ fn.call(this)
24
27
  get: (path, getCallback) ->
25
28
  @waitForAssertions ->
26
29
  test = this
@@ -176,7 +179,7 @@ class Body
176
179
  class PendingTest
177
180
  constructor: (@runner, @name) ->
178
181
  run: (callback) -> callback('pending')
179
-
182
+ actuallyRun: -> false
180
183
  class TestFile
181
184
  constructor: (@suite, @name) ->
182
185
  @tests = []
@@ -191,27 +194,39 @@ class TestFile
191
194
  for test in @tests
192
195
  throw("Identically named test already exists for name #{name} in #{@name}") if test.name == name
193
196
  @tests.push new Test(this, name, body)
194
- run: (callback) ->
197
+ run: (callback, idx) ->
195
198
  throw "No root is defined" unless @root?
196
199
  testFile = this
197
200
  testStates = {}
198
201
  nextTest = (count) ->
199
- test = testFile.tests[count]
200
- before.call(test) for before in testFile.befores
201
- try
202
- if count < testFile.tests.length
202
+ if count >= testFile.tests.length
203
+ testFile.report(testStates)
204
+ callback()
205
+ else
206
+ test = testFile.tests[count]
207
+ if test.actuallyRun()
208
+ processBefore = (idx, callback) ->
209
+ if testFile.befores[idx]?
210
+ test.runWithFunction testFile.befores[idx], ->
211
+ processBefore(idx + 1, callback)
212
+ else
213
+ callback()
214
+ return
215
+ processBefore 0, ->
216
+ try
217
+ test.run (state) ->
218
+ testStates[test.name] = state
219
+ nextTest(count + 1)
220
+ catch e
221
+ testFile.lastErrors[test.name] = e.toString()
222
+ testStates[test.name] = false
223
+ nextTest(count + 1)
224
+ finally
225
+ after.call(test) for after in testFile.afters
226
+ else
203
227
  test.run (state) ->
204
228
  testStates[test.name] = state
205
229
  nextTest(count + 1)
206
- else
207
- testFile.report(testStates)
208
- callback()
209
- catch e
210
- testFile.lastErrors[test.name] = e.toString()
211
- testStates[test.name] = false
212
- nextTest(count + 1)
213
- finally
214
- after.call(test) for before in testFile.afters
215
230
  nextTest(0)
216
231
  report: (testStates) ->
217
232
  success = 0
@@ -12,18 +12,23 @@ class Ghostbuster
12
12
  @dir = File.directory?(@paths[0]) ? @paths[0] : File.dirname(@paths[0])
13
13
  @ghost_lib = File.expand_path(File.join(File.dirname(__FILE__), "ghostbuster.coffee"))
14
14
  @phantom_bin = File.join(ENV['HOME'], '.ghostbuster', 'phantomjs')
15
+ STDOUT.sync = true
15
16
  end
16
17
 
17
18
  def run
18
19
  files = Array(@paths).map{|path| Dir[path].to_a}.flatten.map{|f| File.expand_path(f)}
19
20
  status = 1
20
21
  Dir.chdir(@dir) do
21
- sh "./start.sh"
22
- sleep 2
22
+ spinner "Starting server" do
23
+ sh "./start.sh"
24
+ sleep 2
25
+ end
23
26
  begin
24
27
  _, status = Process.waitpid2 fork { exec("#{@phantom_bin} #{@ghost_lib} #{files.join(' ')}") }
25
28
  ensure
26
- sh "./stop.sh"
29
+ spinner "Stopping server" do
30
+ sh "./stop.sh"
31
+ end
27
32
  end
28
33
  end
29
34
  exit(status)
@@ -32,4 +37,24 @@ class Ghostbuster
32
37
  def self.run(path)
33
38
  new(path).run
34
39
  end
40
+
41
+ private
42
+ def spinner(msg, &blk)
43
+ STDOUT.sync = true
44
+ print msg
45
+ print " "
46
+ spin = Thread.new do
47
+ i = 0
48
+ loop do
49
+ s = '/-\\|'
50
+ print s[i % 4].chr
51
+ i += 1
52
+ sleep 0.1
53
+ print "\b"
54
+ end
55
+ end
56
+ yield
57
+ spin.kill
58
+ puts
59
+ end
35
60
  end
@@ -1,3 +1,3 @@
1
1
  class Ghostbuster
2
- VERSION = '0.0.4'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghostbuster
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 4
10
- version: 0.0.4
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Josh Hull
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-26 00:00:00 -07:00
18
+ date: 2011-08-29 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency