gnawrnip 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -5,5 +5,6 @@ gemspec
5
5
 
6
6
  group :test do
7
7
  gem 'poltergeist'
8
+ gem 'selenium-webdriver'
8
9
  gem 'sinatra'
9
10
  end
@@ -1,27 +1,61 @@
1
1
  Feature: Access
2
2
 
3
- Scenario: / (Success)
3
+ Scenario: / (SUCCESS)
4
4
  When I am on the "/"
5
5
  Then I should see "Hello World"
6
6
 
7
- Scenario: / (Failed...)
7
+ Scenario: / (FAILED)
8
8
  When I am on the "/"
9
9
  Then I should see "Hoge World"
10
10
 
11
- Scenario: /form (Success)
11
+ Scenario: /form (SUCCESS)
12
12
  When I am on the "/form"
13
13
  And type "Gongo" to "name"
14
14
  And click "Go!"
15
15
  Then I should see "Gongo"
16
16
 
17
- Scenario: /form (Failed...)
17
+ Scenario: /form (FAILED)
18
18
  When I am on the "/form"
19
19
  And type "Gongo" to "name"
20
20
  And click "Go!"
21
21
  Then I should see "Gengo"
22
22
 
23
- Scenario: /form (Failed...)
23
+ Scenario: /form (FAILED)
24
24
  When I am on the "/form"
25
25
  And type "Gongo" to "name"
26
26
  And click "Push"
27
27
  Then I should see "Gongo"
28
+
29
+ @javascript
30
+ Scenario: /confirm (SUCCESS) (confirm 'ok' using selenium)
31
+ When I am on the "/confirm"
32
+ And type "Gongo" to "name"
33
+ And click "Go!"
34
+ And "submit?" confirm is "ok"
35
+ Then I should see "Gongo"
36
+
37
+ @javascript
38
+ Scenario: /confirm (SUCCESS) (confirm 'cancel' using selenium)
39
+ When I am on the "/confirm"
40
+ And type "Gongo" to "name"
41
+ And click "Go!"
42
+ And "submit?" confirm is "cancel"
43
+ Then I should not see "Gongo"
44
+ And typed "name" with "Gongo"
45
+
46
+ @javascript
47
+ Scenario: /confirm (FAILED) (confirm 'ok' using selenium)
48
+ When I am on the "/confirm"
49
+ And type "Gongo" to "name"
50
+ And click "Go!"
51
+ And "submit?" confirm is "ok"
52
+ Then I should see "Gengo"
53
+
54
+ @javascript
55
+ Scenario: /confirm (FAILED) (confirm 'cancel' using selenium)
56
+ When I am on the "/confirm"
57
+ And type "Gongo" to "name"
58
+ And click "Go!"
59
+ And "submit?" confirm is "cancel"
60
+ Then I should not see "Gongo"
61
+ And typed "name" with "Gengo"
@@ -17,3 +17,5 @@ end
17
17
  require_relative '../web'
18
18
  Capybara.app = Sinatra::Application.new
19
19
  Capybara.default_driver = :poltergeist
20
+ Capybara.javascript_driver = :selenium
21
+
@@ -6,10 +6,25 @@ step 'I should see :text' do |text|
6
6
  expect(page).to have_content(text)
7
7
  end
8
8
 
9
+ step 'I should not see :text' do |text|
10
+ expect(page).not_to have_content(text)
11
+ end
12
+
9
13
  step 'type :text to :field' do |text, field|
10
14
  fill_in field, with: text
11
15
  end
12
16
 
17
+ step 'typed :field with :text' do |field, text|
18
+ expect(page).to have_field(field, with: text)
19
+ end
20
+
13
21
  step 'click :button' do |button|
14
22
  click_button button
15
23
  end
24
+
25
+ step ':text confirm is :choice' do |text, choice|
26
+ dialog = page.driver.browser.switch_to.alert
27
+ expect(dialog.text).to eq text
28
+
29
+ choice == 'ok' ? dialog.accept : dialog.dismiss
30
+ end
data/example/web.rb CHANGED
@@ -13,6 +13,14 @@ post '/result' do
13
13
  erb :index
14
14
  end
15
15
 
16
+ get '/confirm' do
17
+ erb :confirm
18
+ end
19
+
20
+ post '/result_confirm' do
21
+ erb :confirm
22
+ end
23
+
16
24
 
17
25
  __END__
18
26
 
@@ -33,3 +41,21 @@ __END__
33
41
  </form>
34
42
  </body>
35
43
  </html>
44
+
45
+ @@ confirm
46
+ <!DOCTYPE html>
47
+ <html>
48
+ <head>
49
+ <style>
50
+ body { background-color: #aaaaaa; }
51
+ div#result { color: red; }
52
+ </style>
53
+ </head>
54
+ <body>
55
+ <div id="result"><%= params[:name] %></div>
56
+ <form method="POST" action="/result_confirm">
57
+ <label>Name: <input type="text" name="name"></label>
58
+ <input type="submit" value="Go!" onclick="return confirm('submit?');" />
59
+ </form>
60
+ </body>
61
+ </html>
data/gnawrnip.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency 'capybara', "~> 2.1"
22
- spec.add_dependency 'turnip_formatter', '~> 0.1.2'
22
+ spec.add_dependency 'turnip_formatter', '~> 0.2.0'
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency 'rspec'
@@ -2,19 +2,17 @@ require 'capybara/session'
2
2
 
3
3
  module Capybara
4
4
  class Session
5
- SAVE_SCREENSHOT_METHODS = [
6
- :attach_file, :check, :choose, :click_link_or_button, :click_button,
7
- :click_link, :fill_in, :select, :uncheck, :unselect, :click_on,
8
- :evaluate_script, :visit
5
+ SAVE_SCREENSHOT_METHODS = NODE_METHODS + [
6
+ :visit, :has_title?, :has_no_title?
9
7
  ]
10
8
 
11
- # SAVE_SCREENSHOT_METHODS.each do |method|
12
- # alias_method "after_hook_#{method}".to_sym, method
13
- #
14
- # define_method method do |*args, &block|
15
- # send("after_hook_#{method}", *args, &block)
16
- # Gnawrnip::Animation.add_frame
17
- # end
18
- # end
9
+ SAVE_SCREENSHOT_METHODS.each do |method|
10
+ alias_method "after_hook_#{method}".to_sym, method
11
+
12
+ define_method method do |*args, &block|
13
+ Gnawrnip::Animation.add_frame
14
+ send("after_hook_#{method}", *args, &block)
15
+ end
16
+ end
19
17
  end
20
18
  end
Binary file
@@ -10,9 +10,7 @@ RSpec.configure do |config|
10
10
  config.after(:each, turnip: true) do
11
11
  if example.exception
12
12
  example.metadata[:gnawrnip] = {}
13
-
14
- # example.metadata[:gnawrnip][:screenshot] = Gnawrnip::Animation.generate
15
- example.metadata[:gnawrnip][:screenshot] = Gnawrnip::Screenshot.take
13
+ example.metadata[:gnawrnip][:screenshot] = Gnawrnip::Animation.frames.compact
16
14
  end
17
15
  end
18
16
  end
@@ -16,7 +16,7 @@ module Gnawrnip
16
16
  def take
17
17
  tempfile = Tempfile.new(['gnawrnip', '.png'])
18
18
  session.save_screenshot(tempfile.path)
19
- image = Base64.encode64(tempfile.read)
19
+ image = Base64.strict_encode64(tempfile.read)
20
20
  tempfile.close
21
21
  image
22
22
  end
@@ -1,19 +1,82 @@
1
+ require 'base64'
2
+ require 'turnip_formatter/template'
1
3
  require 'turnip_formatter/step/failure'
2
4
 
3
5
  module Gnawrnip
4
6
  module StepScreenshot
5
- #
6
- # @param [String] png_file base64 encoded
7
- #
8
- def self.build(png_base64)
9
- img = '<img src="data:image/png;base64,'
10
- img += png_base64
11
- img += '" style="width: 90%; border: 2px solid black;" />'
12
- img
7
+ class << self
8
+ #
9
+ # @param [Array] png_base64_list array of base64 encoded image
10
+ #
11
+ def build(png_base64_list)
12
+ case png_base64_list.length
13
+ when 0
14
+ description_no_screenshot
15
+ when 1
16
+ still_image(png_base64_list.first)
17
+ else
18
+ animation_image(png_base64_list)
19
+ end
20
+ end
21
+
22
+ def description_no_screenshot
23
+ @no_screenshot ||= description_frame(:no_screenshot)
24
+ still_image(@no_screenshot)
25
+ end
26
+
27
+ def animation_image(images)
28
+ text = '<div class="screenshot animation">'
29
+ text += images.map { |data| img_tag(data) }.join
30
+ text + '</div>'
31
+ end
32
+
33
+ def still_image(data)
34
+ '<div class="screenshot">' + img_tag(data) + '</div>'
35
+ end
36
+
37
+ def img_tag(data)
38
+ '<img src="data:image/png;base64,' + data + '"/>'
39
+ end
40
+
41
+ def description_frame(scene)
42
+ path = File.dirname(__FILE__) + "/#{scene.to_s}.png"
43
+ Base64.strict_encode64(File.read(path))
44
+ end
13
45
  end
14
46
  end
15
47
  end
16
48
 
17
- TurnipFormatter::Step::Failure.add_template :screenshot, Gnawrnip::StepScreenshot do
18
- example.metadata[:gnawrnip][:screenshot]
49
+ module TurnipFormatter
50
+ Template.add_scss(<<-EOS)
51
+ div#steps-statistics section.scenario {
52
+ ul.steps {
53
+ div.screenshot {
54
+ > img {
55
+ width: 90%;
56
+ border: 2px solid black;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ EOS
62
+
63
+ Template.add_js(<<-EOS)
64
+ $(function() {
65
+ $('.screenshot.animation').each(function() {
66
+ var imgs = $(this).children('img');
67
+ var frame = 0;
68
+
69
+ imgs.hide();
70
+ setInterval(function() {
71
+ imgs.hide();
72
+ imgs.eq(frame).show();
73
+ frame = (++frame % imgs.length);
74
+ }, 1000);
75
+ });
76
+ });
77
+ EOS
78
+
79
+ Step::Failure.add_template Gnawrnip::StepScreenshot do
80
+ example.metadata[:gnawrnip][:screenshot] || []
81
+ end
19
82
  end
@@ -1,3 +1,3 @@
1
1
  module Gnawrnip
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -15,13 +15,17 @@ module Gnawrnip
15
15
  example
16
16
  end
17
17
 
18
+ before do
19
+ Gnawrnip::Animation.stub(:frames) { ['aiueo', nil, 'lllll'] }
20
+ end
21
+
18
22
  context '"turnip" spec group' do
19
23
  let(:group) do
20
24
  ::RSpec::Core::ExampleGroup.describe('Feature', turnip: true)
21
25
  end
22
26
 
23
27
  it 'should save screen shot at error' do
24
- expect(example.metadata[:gnawrnip][:screenshot]).to eq "c2NyZWVuc2hvdA==\n"
28
+ expect(example.metadata[:gnawrnip][:screenshot]).to eq ['aiueo', 'lllll']
25
29
  end
26
30
  end
27
31
 
@@ -7,7 +7,7 @@ module Gnawrnip
7
7
  subject { Screenshot.take }
8
8
 
9
9
  # see GnawrnipTestSession::save_screenshot
10
- it { should == "c2NyZWVuc2hvdA==\n" }
10
+ it { should == "c2NyZWVuc2hvdA==" }
11
11
  end
12
12
  end
13
13
  end
@@ -8,12 +8,37 @@ module Gnawrnip
8
8
  end
9
9
 
10
10
  it 'exists failure step template' do
11
- expect(TurnipFormatter::Step::Failure.templates).to have_key :screenshot
11
+ expect(TurnipFormatter::Step::Failure.templates).to have_key template
12
12
  end
13
13
 
14
14
  describe '.build' do
15
- subject { template.build('aiueo') }
16
- it { should match %r{<img src="data:image/png;base64,aiueo"} }
15
+ subject { template.build(data_list) }
16
+
17
+ context 'has multiple data' do
18
+ let(:data_list) { ['aiueo', '12345', 'abcde'] }
19
+ it {
20
+ should include '<div class="screenshot animation">'
21
+ should include '<img src="data:image/png;base64,aiueo"/>'
22
+ should include '<img src="data:image/png;base64,12345"/>'
23
+ should include '<img src="data:image/png;base64,abcde"/></div>'
24
+ }
25
+ end
26
+
27
+ context 'has single data' do
28
+ let(:data_list) { ['aiueo'] }
29
+ it {
30
+ should include '<div class="screenshot">'
31
+ should include '<img src="data:image/png;base64,aiueo"/></div>'
32
+ }
33
+ end
34
+
35
+ context 'has no data' do
36
+ let(:data_list) { [] }
37
+ it {
38
+ should include '<div class="screenshot">'
39
+ should include '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhQ'
40
+ }
41
+ end
17
42
  end
18
43
  end
19
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gnawrnip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-24 00:00:00.000000000 Z
12
+ date: 2013-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: capybara
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 0.1.2
37
+ version: 0.2.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 0.1.2
45
+ version: 0.2.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: bundler
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -131,6 +131,7 @@ files:
131
131
  - lib/gnawrnip.rb
132
132
  - lib/gnawrnip/animation.rb
133
133
  - lib/gnawrnip/ext/capybara/session.rb
134
+ - lib/gnawrnip/no_screenshot.png
134
135
  - lib/gnawrnip/rspec.rb
135
136
  - lib/gnawrnip/screenshot.rb
136
137
  - lib/gnawrnip/step_screenshot.rb