domino 0.2.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+ - jruby-18mode
6
+ - jruby-19mode
7
+ - rbx-18mode
8
+ - rbx-19mode
9
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in domino.gemspec
4
+ gemspec
@@ -1,4 +1,6 @@
1
- Copyright (c) 2011 [name of plugin creator]
1
+ Copyright (c) 2012 Nick Gauthier
2
+
3
+ MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
@@ -17,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
19
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
20
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
21
  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.
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Domino
1
+ # Domino [![Build Status](http://travis-ci.org/ngauthier/domino.png)](http://travis-ci.org/ngauthier/domino)
2
2
 
3
3
  View abstraction for integration testing
4
4
 
@@ -34,6 +34,25 @@ What makes it really powerful is defining scoped actions:
34
34
  Dom::Post.find_by_title('First Post').delete
35
35
  assert_nil Dom::Post.find_by_title('First Post')
36
36
 
37
+ ## Integration with capybara
38
+
39
+ Domino uses capybara internally to search html for nodes and
40
+ attributes. If you need to do something special, you can have direct
41
+ access to the capybara node.
42
+
43
+ module Dom
44
+ class Account < Domino
45
+ selector "#accounts li"
46
+ # Returns this node text
47
+ def text
48
+ node.text
49
+ end
50
+ end
51
+ end
52
+
53
+ For more information about using Capybara nodes, check [Capybara Documentation](https://github.com/jnicklas/capybara/blob/master/README.rdoc).
54
+
55
+
37
56
  ## Integration with Cucumber
38
57
 
39
58
  Add a features/support/dominos.rb file, in which you define your dominos.
@@ -53,7 +72,7 @@ in your test\_helper.rb (doesn't have to be inside a Rails test class).
53
72
 
54
73
  ## Example
55
74
 
56
- Check out [Domino Example](http://github.com/ngauthier/domino_example) for an
75
+ Check out [Domino Example](http://github.com/ngauthier/domino_example) for an
57
76
  example of using Test::Unit and Cucumber with Domino.
58
77
 
59
78
  ## Copyright
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ desc "Run the tests"
4
+ task :test do
5
+ require File.join(File.dirname(__FILE__), 'test', 'domino_test')
6
+ end
7
+
8
+ task :default => :test
data/domino.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ Gem::Specification.new do |gem|
3
+ gem.name = "domino"
4
+ gem.version = "0.3.1"
5
+ gem.platform = Gem::Platform::RUBY
6
+ gem.authors = ["Nick Gauthier"]
7
+ gem.email = ["ngauthier@gmail.com"]
8
+ gem.homepage = "http://github.com/ngauthier/domino"
9
+ gem.summary = "View abstraction for integration testing"
10
+ gem.description = %{
11
+ Make it easier to deal with UI elements by providing an
12
+ interface that decouples your tests from your views.
13
+ }
14
+ gem.rubygems_version = '>= 1.3.6'
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.extra_rdoc_files = ['README.md']
19
+ gem.license = 'MIT'
20
+
21
+ gem.add_dependency('capybara', '>= 0.4.0')
22
+ gem.add_development_dependency('minitest')
23
+ gem.add_development_dependency('rake')
24
+ gem.add_development_dependency('simplecov')
25
+ end
26
+
data/lib/domino.rb CHANGED
@@ -65,6 +65,10 @@ class Domino
65
65
  @selector = s
66
66
  end
67
67
 
68
+ def attributes
69
+ @attributes ||= []
70
+ end
71
+
68
72
  # Define an attribute for this Domino
69
73
  #
70
74
  # module Dom
@@ -81,6 +85,8 @@ class Domino
81
85
  # Dom::Post.find_by_title("First Post")
82
86
  # Dom::Post.find_by_title(/^First/)
83
87
  def attribute(attribute, selector = nil)
88
+ attributes << attribute.to_sym
89
+
84
90
  selector ||= %{.#{attribute.to_s}}
85
91
 
86
92
  class_eval %{
@@ -103,14 +109,9 @@ class Domino
103
109
  Capybara.current_session.all(@selector)
104
110
  end
105
111
 
106
- # Internal method for finding nodes by a selector
112
+ # Internal method for finding nodes by a selector
107
113
  def find_by_attribute(selector, value)
108
- case value
109
- when Regexp
110
- detect{|node| node.attribute(selector) =~ value }
111
- else
112
- detect{|node| node.attribute(selector) == value }
113
- end
114
+ detect{|node| value === node.attribute(selector) }
114
115
  end
115
116
  end
116
117
 
@@ -128,6 +129,13 @@ class Domino
128
129
  @node['id'].nil? ? nil : %{##{@node['id']}}
129
130
  end
130
131
 
132
+ def attributes
133
+ self.class.attributes.inject({}) do |memo, attribute|
134
+ memo[attribute] = send(attribute)
135
+ memo
136
+ end
137
+ end
138
+
131
139
  private
132
140
  # Store the capybara node internally
133
141
  def initialize(node)
@@ -0,0 +1,3 @@
1
+ module Domino
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,128 @@
1
+ require 'bundler/setup'
2
+ unless ENV['CI']
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+ end
6
+ Bundler.require
7
+ require 'minitest/autorun'
8
+ require 'minitest/mock'
9
+
10
+ class TestApplication
11
+ def call(env)
12
+ [200, {"Content-Type" => "text/plain"}, [%{
13
+ <html>
14
+ <body>
15
+ <h1>Here are people and animals</h1>
16
+ <div id='people'>
17
+ <div class='person'>
18
+ <h2 class='name'>Alice</h2>
19
+ <p class='bio'>Alice is fun</p>
20
+ <p class='fav-color'>Blue</p>
21
+ </div>
22
+ <div class='person'>
23
+ <h2 class='name'>Bob</h2>
24
+ <p class='bio'>Bob is smart</p>
25
+ <p class='fav-color'>Red</p>
26
+ </div>
27
+ <div class='person'>
28
+ <h2 class='name'>Charlie</h2>
29
+ <p class='bio'>Charlie is wild</p>
30
+ <p class='fav-color'>Red</p>
31
+ </div>
32
+ <div class='person'>
33
+ <h2 class='name'>Donna</h2>
34
+ <p class='bio'>Donna is quiet</p>
35
+ </div>
36
+ </div>
37
+ <div id='animals'></div>
38
+ <div id='receipts'>
39
+ <div class='receipt' id='receipt-72' data-store='ACME'></div>
40
+ </div>
41
+ </body>
42
+ </html>
43
+ }]]
44
+ end
45
+ end
46
+
47
+ Capybara.app = TestApplication.new
48
+
49
+
50
+ class DominoTest < MiniTest::Unit::TestCase
51
+ include Capybara::DSL
52
+ module Dom
53
+ class Person < Domino
54
+ selector '#people .person'
55
+ attribute :name
56
+ attribute :biography, '.bio'
57
+ attribute :favorite_color, '.fav-color'
58
+ end
59
+
60
+ class Animal < Domino
61
+ selector '#animals .animal'
62
+ attribute :name
63
+ end
64
+
65
+ class Car < Domino
66
+ selector '#cars .car'
67
+ end
68
+
69
+ class NoSelector < Domino
70
+ end
71
+
72
+ class Receipt < Domino
73
+ selector '#receipts .receipt'
74
+ end
75
+ end
76
+
77
+ def setup
78
+ visit '/'
79
+ end
80
+
81
+ def test_enumerable
82
+ assert_equal 4, Dom::Person.count
83
+ assert_equal 0, Dom::Animal.count
84
+ assert_equal 0, Dom::Car.count
85
+
86
+ assert_equal 4, Dom::Person.all.size
87
+
88
+ red_people = Dom::Person.select{|p| p.favorite_color == 'Red'}
89
+ assert_equal 2, red_people.count
90
+
91
+ assert_equal(
92
+ %w(Donna Alice Bob Charlie),
93
+ Dom::Person.sort{|a,b|
94
+ a.favorite_color.to_s <=> b.favorite_color.to_s
95
+ }.map(&:name)
96
+ )
97
+ end
98
+
99
+ def test_no_selector
100
+ assert_raises Domino::Error do
101
+ Dom::NoSelector.first
102
+ end
103
+ end
104
+
105
+ def test_no_id
106
+ assert_nil Dom::Person.first.id
107
+ end
108
+
109
+ def test_id
110
+ assert_equal '#receipt-72', Dom::Receipt.first.id
111
+ end
112
+
113
+ def test_find_by_attribute_string
114
+ assert_equal 'Alice', Dom::Person.find_by_biography('Alice is fun').name
115
+ end
116
+
117
+ def test_find_by_attribute_regex
118
+ assert_equal 'Charlie', Dom::Person.find_by_biography(/wild/).name
119
+ end
120
+
121
+ def test_node_properties
122
+ assert_equal 'ACME', Dom::Receipt.first.node['data-store']
123
+ end
124
+
125
+ def test_attributes
126
+ assert_equal({:name => 'Alice', :biography => 'Alice is fun', :favorite_color => 'Blue'}, Dom::Person.first.attributes)
127
+ end
128
+ end
metadata CHANGED
@@ -1,98 +1,129 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: domino
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 1
10
- version: 0.2.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Nick Gauthier
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-06-17 00:00:00 -04:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-12-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: capybara
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 15
30
- segments:
31
- - 0
32
- - 4
33
- - 0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
34
21
  version: 0.4.0
35
22
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.4.0
30
+ - !ruby/object:Gem::Dependency
38
31
  name: minitest
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
39
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 3
46
- segments:
47
- - 0
48
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
49
54
  type: :development
50
- version_requirements: *id002
51
- description: "\n Make it easier to deal with UI elements by providing an\n interface that decouples your tests from your views.\n "
52
- email: ngauthier@gmail.com
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: ! "\n Make it easier to deal with UI elements by providing an\n interface
79
+ that decouples your tests from your views.\n "
80
+ email:
81
+ - ngauthier@gmail.com
53
82
  executables: []
54
-
55
83
  extensions: []
56
-
57
- extra_rdoc_files:
84
+ extra_rdoc_files:
58
85
  - README.md
59
- files:
60
- - lib/domino.rb
61
- - MIT-LICENSE
86
+ files:
87
+ - .gitignore
88
+ - .travis.yml
89
+ - Gemfile
90
+ - LICENSE.txt
62
91
  - README.md
63
- has_rdoc: true
64
- homepage: http://www.github.com/ngauthier/domino
65
- licenses:
92
+ - Rakefile
93
+ - domino.gemspec
94
+ - lib/domino.rb
95
+ - lib/domino/version.rb
96
+ - test/domino_test.rb
97
+ homepage: http://github.com/ngauthier/domino
98
+ licenses:
66
99
  - MIT
67
100
  post_install_message:
68
101
  rdoc_options: []
69
-
70
- require_paths:
102
+ require_paths:
71
103
  - lib
72
- required_ruby_version: !ruby/object:Gem::Requirement
104
+ required_ruby_version: !ruby/object:Gem::Requirement
73
105
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ segments:
79
111
  - 0
80
- version: "0"
81
- required_rubygems_version: !ruby/object:Gem::Requirement
112
+ hash: 2315885640870791480
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
114
  none: false
83
- requirements:
84
- - - ">="
85
- - !ruby/object:Gem::Version
86
- hash: 3
87
- segments:
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ segments:
88
120
  - 0
89
- version: "0"
121
+ hash: 2315885640870791480
90
122
  requirements: []
91
-
92
123
  rubyforge_project:
93
- rubygems_version: 1.6.2
124
+ rubygems_version: 1.8.23
94
125
  signing_key:
95
126
  specification_version: 3
96
127
  summary: View abstraction for integration testing
97
- test_files: []
98
-
128
+ test_files:
129
+ - test/domino_test.rb