ghostbuster 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ STDOUT.sync = true
4
4
 
5
5
  namespace :test do
6
6
  [:working_via_bin, :working_via_rake].each do |task_name|
7
- desc "Run test for `working' test suite (via binary)"
7
+ desc "Run test for `working' test suite (#{task_name})"
8
8
  task task_name do
9
9
  print "#{task_name} ... "
10
10
  Dir.chdir("test/working_ghost") do
@@ -18,7 +18,7 @@ namespace :test do
18
18
  end
19
19
  begin
20
20
  matcher.each{|m| out[m] or raise("Couldn't match for #{m.inspect}")}
21
- raise("There are a weird number of screenshots") unless Dir['*.png'].to_a.size == 14
21
+ raise("There are a weird number of screenshots") unless Dir['*.png'].to_a.size == 15
22
22
  exit
23
23
  rescue
24
24
  puts $!.message
@@ -36,7 +36,7 @@ namespace :test do
36
36
  task :non_working do
37
37
  print "non_working_ghost ... "
38
38
  Dir.chdir("test/non_working_ghost") do
39
- matcher = [/0 success, 8 failure, 1 pending/, /Bad link traversal\s+Assert location failed: Excepted http:\/\/127\.0\.0\.1:4567\/not-correct, got http:\/\/127\.0\.0\.1:4567\//, /Form input not equal\s+Assert first for selector #out did not meet expectations/, /To an invalid URL\s+The request for http:\/\/127\.0\.0\.1:this-url-is-invalid failed/, /This test will explode!\s+I hate you!/, /This test has no succeed\s+This test took too long/, /This test has a custom assertion name\s+Assert first "custom assertion name" did not meet expectations/]
39
+ matcher = [/0 success, 9 failure, 1 pending/, /Bad link traversal\s+Assert location failed: Excepted http:\/\/127\.0\.0\.1:4567\/not-correct, got http:\/\/127\.0\.0\.1:4567\//, /Form input not equal\s+Assert first for selector #out did not meet expectations/, /To an invalid URL\s+The request for http:\/\/127\.0\.0\.1:this-url-is-invalid failed/, /This test will explode!\s+I hate you!/, /This test has no succeed\s+This test took too long/, /This test has a custom assertion name\s+Assert first "custom assertion name" did not meet expectations/, /Bad click selector\s+Couldn't find element 0 for selector i-just-made-this-up/]
40
40
  fork {
41
41
  ENV['BUNDLE_GEMFILE'] = File.expand_path("./Gemfile")
42
42
  `bundle install`
@@ -3,30 +3,27 @@
3
3
  case RUBY_PLATFORM
4
4
  when /darwin/
5
5
  require 'fileutils'
6
- puts "Creating ghostbuster directory in your home"
7
6
  root = File.expand_path(File.join(ENV['HOME'], '.ghostbuster'))
8
7
  cache = File.expand_path(File.join(root, 'cache'))
9
- unless File.exist?(File.join(root, 'version')) && File.read(File.join(root, 'version')) == '1'
8
+ unless File.exist?(File.join(root, 'version')) && File.read(File.join(root, 'version')) == '2'
9
+ puts "Creating ghostbuster directory in your home"
10
10
  FileUtils.rm_rf(root)
11
11
  FileUtils.mkdir_p(root)
12
12
  FileUtils.mkdir_p(cache)
13
- phantom_url = "http://phantomjs.googlecode.com/files/phantomjs-1.2.0-macosx-universal.dmg"
13
+ phantom_url = "http://phantomjs.googlecode.com/files/phantomjs-1.3.0-macosx-static-x86.zip"
14
14
  unless File.exist?(File.join(cache, File.basename(phantom_url)))
15
15
  Dir.chdir(cache) do
16
- puts "Downloading and install phantom.js"
16
+ puts "Downloading and installing phantom.js"
17
17
  system("curl #{phantom_url} -O") or raise("Unable to download from #{phantom_url}")
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")
18
+ system("unzip #{File.basename(phantom_url)}") or raise("Unable to unzip archive")
21
19
  end
22
- system("cp -r /Volumes/phantomjs/phantomjs.app #{root}")
23
- File.exist?("#{root}/phantomjs.app") or raise("Unable to copy phantomjs from your disk image")
24
- system("ln -s #{root}/phantomjs.app/Contents/MacOS/phantomjs #{root}/phantomjs") or raise("Unable to copy phantomjs from your disk image")
25
- `hdiutil eject /Volumes/phantomjs`
26
- File.open("#{root}/version", 'w') {|f| f << '1' }
27
- else
28
- puts "Already installed and at the right version"
20
+ File.exist?("#{cache}/phantomjs-1.3.0/bin/phantomjs") or raise("Unable to copy phantomjs from your disk image")
21
+ system("ln -s #{cache}/phantomjs-1.3.0/bin/phantomjs #{root}/phantomjs") or raise("Unable to copy phantomjs from your disk image")
22
+ File.open("#{root}/version", 'w') {|f| f << '2' }
23
+ puts "Done installing!"
29
24
  end
25
+ else
26
+ puts "Already installed and at the right version"
30
27
  end
31
28
  else
32
29
  puts "I don't know how to install for RUBY_PLATFORM #{RUBY_PLATFORM}"
@@ -123,19 +123,27 @@ class Body
123
123
  "
124
124
  @test.page.evaluate(input)
125
125
 
126
- click: (selector, idx) ->
127
- idx ||= 0
128
- eval "
129
- var fn = function() {
130
- var targets = document.querySelectorAll('#{selector}'),
131
- evt = document.createEvent('MouseEvents'),
132
- idx = #{idx};
133
- evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
134
- if (idx < targets.length) targets[idx].dispatchEvent(evt);
135
- else throw('Couldnt find element #{idx} for selector #{selector}');
136
- };
137
- "
138
- @test.page.evaluate(fn)
126
+ click: (selector, opts) ->
127
+ opts ||= {}
128
+ test = @test
129
+ @test.assert opts, (withValue) ->
130
+ idx = opts.index || 0
131
+ eval "
132
+ var evaluator = function() {
133
+ var targets = document.querySelectorAll('#{selector}'),
134
+ evt = document.createEvent('MouseEvents'),
135
+ idx = #{idx};
136
+ evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
137
+ if (idx < targets.length) {
138
+ targets[idx].dispatchEvent(evt);
139
+ return true;
140
+ } else {
141
+ alert('Couldn\\'t find element #{idx} for selector #{selector}');
142
+ return false;
143
+ }
144
+ };
145
+ "
146
+ withValue @page.evaluate(evaluator)
139
147
 
140
148
  assertCount: (selector, opts, assertionCallback) ->
141
149
  unless assertionCallback?
@@ -339,33 +347,37 @@ class TestSuite
339
347
  @failure += failure
340
348
  @pending += pending
341
349
  run: ->
342
- @screenshots = @args[0] == 'true'
343
- @screenshot_x = @args[1]
344
- @screenshot_y = @args[2]
345
- @screenshot_dir = @args[3]
346
- count = 4
347
- suite = this
348
- runNextTest = ->
349
- if suite.args.length == count
350
- console.log "#{suite.success} success, #{suite.failure} failure, #{suite.pending} pending"
351
- phantom.exit (if suite.failure == 0 then 0 else 1)
352
- else
353
- testFile = suite.args[count]
354
- phantom.test = new TestFile(suite, testFile)
355
- if phantom.injectJs(testFile)
356
- try
357
- phantom.test.run ->
350
+ if phantom.version.major == 1 and phantom.version.minor == 3
351
+ @screenshots = @args[0] == 'true'
352
+ @screenshot_x = @args[1]
353
+ @screenshot_y = @args[2]
354
+ @screenshot_dir = @args[3]
355
+ count = 4
356
+ suite = this
357
+ runNextTest = ->
358
+ if suite.args.length == count
359
+ console.log "#{suite.success} success, #{suite.failure} failure, #{suite.pending} pending"
360
+ phantom.exit (if suite.failure == 0 then 0 else 1)
361
+ else
362
+ testFile = suite.args[count]
363
+ phantom.test = new TestFile(suite, testFile)
364
+ if phantom.injectJs(testFile)
365
+ try
366
+ phantom.test.run ->
367
+ count++
368
+ runNextTest()
369
+ catch e
370
+ console.log "For \033[1m#{testFile}\033[0m"
371
+ console.log " \033[31m\u2717\033[0m #{e.toString()}"
372
+ suite.failure++
358
373
  count++
359
374
  runNextTest()
360
- catch e
361
- console.log "For \033[1m#{testFile}\033[0m"
362
- console.log " \033[31m\u2717\033[0m #{e.toString()}"
363
- suite.failure++
364
- count++
365
- runNextTest()
366
- else
367
- console.log "Unable to load #{testFile}"
368
- runNextTest()
375
+ else
376
+ console.log "Unable to load #{testFile}"
377
+ runNextTest()
378
+ else
379
+ console.log "Phantom version must be 1.3.x"
380
+ phantom.exit 1
369
381
 
370
382
  if phantom.args.length == 0
371
383
  console.log("You need to specify a test file")
@@ -25,19 +25,31 @@ class Ghostbuster
25
25
  Dir.chdir(@dir) do
26
26
  load_config
27
27
  spinner "Starting server" do
28
- sh @config.start_command
28
+ if @config.verbose
29
+ puts `#{@config.start_command}`
30
+ raise unless $!.success?
31
+ else
32
+ sh @config.start_command
33
+ end
29
34
  sleep 2
30
35
  end
31
36
  begin
32
37
  _, status = Process.waitpid2 fork {
33
38
  exec("#{@config.phantom_bin} #{@ghost_lib} #{@config.screenshots?} #{@config.screenshot_x} #{@config.screenshot_y} #{@temporary_screenshot_dir} #{Dir[@config.pattern].to_a.join(' ')}")
34
39
  }
35
- spinner "Copying screenshots" do
36
- compress_and_copy_screenshots if status.success? && @config.screenshots?
40
+ if status.success? && @config.screenshots?
41
+ spinner "Copying screenshots" do
42
+ compress_and_copy_screenshots
43
+ end
37
44
  end
38
45
  ensure
39
46
  spinner "Stopping server" do
40
- sh @config.stop_command
47
+ if @config.verbose
48
+ puts `#{@config.stop_command}`
49
+ raise unless $!.success?
50
+ else
51
+ sh @config.stop_command
52
+ end
41
53
  end
42
54
  if @config.screenshots?
43
55
  spinner "Cleaning up temporary screenshots" do
@@ -1,6 +1,6 @@
1
1
  class Ghostbuster
2
2
  class Config
3
- attr_accessor :pattern, :screenshot_dir, :start_command, :stop_command, :phantom_bin, :temp_dir
3
+ attr_accessor :pattern, :screenshot_dir, :start_command, :stop_command, :phantom_bin, :temp_dir, :verbose
4
4
  attr_reader :screenshot_x, :screenshot_y
5
5
  def initialize(path_to_file = nil)
6
6
  @config_file = path_to_file || './Ghostfile'
@@ -9,6 +9,7 @@ class Ghostbuster
9
9
  @phantom_bin = File.join(ENV['HOME'], '.ghostbuster', 'phantomjs')
10
10
  @screenshot_dir = "."
11
11
  @screenshots = true
12
+ @verbose = false
12
13
  @temp_dir = "/tmp"
13
14
  @start_command, @stop_command = "./start.sh", "./stop.sh"
14
15
  if File.exist?(@config_file)
@@ -1,3 +1,3 @@
1
1
  class Ghostbuster
2
- VERSION = '0.3.3'
2
+ VERSION = '0.3.4'
3
3
  end
@@ -6,6 +6,11 @@ phantom.test.add "Bad link traversal", ->
6
6
  @body.assertLocation('/not-correct')
7
7
  @succeed()
8
8
 
9
+ phantom.test.add "Bad click selector", ->
10
+ @get '/', ->
11
+ @body.click 'i-just-made-this-up'
12
+ @succeed()
13
+
9
14
  phantom.test.add "Form input not equal", ->
10
15
  @get '/form', ->
11
16
  @body.input "#in", "this is my input"
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: 21
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 3
10
- version: 0.3.3
9
+ - 4
10
+ version: 0.3.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Josh Hull
@@ -15,12 +15,13 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-12 00:00:00 -07:00
18
+ date: 2011-10-03 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
+ name: thin
22
23
  prerelease: false
23
- version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ requirement: &id001 !ruby/object:Gem::Requirement
24
25
  none: false
25
26
  requirements:
26
27
  - - ~>
@@ -31,12 +32,12 @@ dependencies:
31
32
  - 2
32
33
  - 11
33
34
  version: 1.2.11
34
- requirement: *id001
35
- name: thin
36
35
  type: :development
36
+ version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
38
+ name: rake
38
39
  prerelease: false
39
- version_requirements: &id002 !ruby/object:Gem::Requirement
40
+ requirement: &id002 !ruby/object:Gem::Requirement
40
41
  none: false
41
42
  requirements:
42
43
  - - ~>
@@ -47,12 +48,12 @@ dependencies:
47
48
  - 8
48
49
  - 7
49
50
  version: 0.8.7
50
- requirement: *id002
51
- name: rake
52
51
  type: :development
52
+ version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
54
+ name: bundler
54
55
  prerelease: false
55
- version_requirements: &id003 !ruby/object:Gem::Requirement
56
+ requirement: &id003 !ruby/object:Gem::Requirement
56
57
  none: false
57
58
  requirements:
58
59
  - - ~>
@@ -63,12 +64,12 @@ dependencies:
63
64
  - 0
64
65
  - 14
65
66
  version: 1.0.14
66
- requirement: *id003
67
- name: bundler
68
67
  type: :development
68
+ version_requirements: *id003
69
69
  - !ruby/object:Gem::Dependency
70
+ name: sinatra
70
71
  prerelease: false
71
- version_requirements: &id004 !ruby/object:Gem::Requirement
72
+ requirement: &id004 !ruby/object:Gem::Requirement
72
73
  none: false
73
74
  requirements:
74
75
  - - ">="
@@ -77,9 +78,8 @@ dependencies:
77
78
  segments:
78
79
  - 0
79
80
  version: "0"
80
- requirement: *id004
81
- name: sinatra
82
81
  type: :development
82
+ version_requirements: *id004
83
83
  description: Integration testing ftw.
84
84
  email:
85
85
  - joshbuddy@gmail.com