test_abstractions 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/test_abstractions/client.rb +78 -0
- data/lib/test_abstractions/configuration.rb +15 -0
- data/lib/test_abstractions/context.rb +17 -0
- data/lib/test_abstractions/entity.rb +11 -0
- data/lib/test_abstractions/evidence.rb +17 -0
- data/lib/test_abstractions/fields.rb +17 -0
- data/lib/test_abstractions/filler.rb +42 -0
- data/lib/test_abstractions/form.rb +157 -0
- data/lib/test_abstractions.rb +19 -0
- metadata +150 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f8a80ea8a8ecac216b40670af27011f1853f58a8
|
4
|
+
data.tar.gz: 953e9065109e71cb3326a328ade78962e414e252
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 056ee11fd25afe933064a009529e36889b3644b637c0d121eef17352417238d3b5943b22ee498256992e45ba9eb203e5092be2fe1e98b5dbeb6385bfe69d221d
|
7
|
+
data.tar.gz: 28656f955e54964d35ce1a3cca7b3259ccfd854a8d4893e1ca8047a932e3f0f22cd537b2732c7bc1952c03d06c41a5e7d8e77e5af6987d5a2532df261683274a
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module TestAbstractions
|
2
|
+
class Client
|
3
|
+
attr_accessor :base_uri
|
4
|
+
attr_accessor :driver
|
5
|
+
|
6
|
+
def initialize(base_uri, driver)
|
7
|
+
@base_uri = base_uri
|
8
|
+
@driver = driver
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.instance
|
12
|
+
@instance ||= build
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.build(base_uri: nil, driver: nil)
|
16
|
+
base_uri ||= Context.instance.base_uri
|
17
|
+
cls = client_class
|
18
|
+
driver ||= cls.driver
|
19
|
+
instance = cls.new base_uri, driver
|
20
|
+
instance
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.client_class
|
24
|
+
only_poltergeist_for_now__selenium_would_also_be_useful
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.only_poltergeist_for_now__selenium_would_also_be_useful
|
28
|
+
Poltergeist
|
29
|
+
end
|
30
|
+
|
31
|
+
def method_missing(meth, *args, &block)
|
32
|
+
delegate_to_driver(meth, *args, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def delegate_to_driver(meth, *args, &block)
|
36
|
+
driver.send meth, *args, &block
|
37
|
+
end
|
38
|
+
|
39
|
+
class Poltergeist < Client
|
40
|
+
extend ::Capybara::DSL
|
41
|
+
|
42
|
+
def self.driver
|
43
|
+
Capybara::Session.new :poltergeist
|
44
|
+
end
|
45
|
+
|
46
|
+
def open(uri)
|
47
|
+
uri = absolute_uri(uri)
|
48
|
+
driver.visit(uri)
|
49
|
+
end
|
50
|
+
|
51
|
+
def absolute_uri(uri)
|
52
|
+
base = URI(base_uri)
|
53
|
+
u = URI(uri)
|
54
|
+
(base + u).to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def enter(content, selector)
|
58
|
+
driver.fill_in(selector, :with => content)
|
59
|
+
end
|
60
|
+
|
61
|
+
def select(option, selector)
|
62
|
+
driver.select(option, :from => selector)
|
63
|
+
end
|
64
|
+
|
65
|
+
def click(selector)
|
66
|
+
click_on(selector)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module Accessor
|
71
|
+
attr_writer :client
|
72
|
+
|
73
|
+
def client
|
74
|
+
@client ||= Client.instance
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module TestAbstractions
|
2
|
+
def configure(&block)
|
3
|
+
configuration = Configuration.instance
|
4
|
+
block.call configuration
|
5
|
+
end
|
6
|
+
module_function :configure
|
7
|
+
|
8
|
+
class Configuration
|
9
|
+
attr_accessor :base_uri
|
10
|
+
|
11
|
+
def self.instance
|
12
|
+
@instance ||= new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TestAbstractions
|
2
|
+
class Context
|
3
|
+
include Initializer
|
4
|
+
|
5
|
+
initializer :base_uri
|
6
|
+
|
7
|
+
def self.instance
|
8
|
+
@instance ||= build
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.build(configuration: nil)
|
12
|
+
configuration ||= Configuration.instance
|
13
|
+
instance = new configuration.base_uri
|
14
|
+
instance
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TestAbstractions
|
2
|
+
module Evidence
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, Client::Accessor
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def build(client=nil)
|
10
|
+
client ||= Client.instance
|
11
|
+
instance = new
|
12
|
+
instance.client = client
|
13
|
+
instance
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TestAbstractions
|
2
|
+
module Fields
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, Client::Accessor
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def build(client=nil)
|
10
|
+
client ||= Client.instance
|
11
|
+
instance = new
|
12
|
+
instance.client = client
|
13
|
+
instance
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module TestAbstractions
|
2
|
+
class Filler
|
3
|
+
# NOTE: try this with include in setup
|
4
|
+
include Initializer
|
5
|
+
|
6
|
+
initializer :data, :form, :mapping
|
7
|
+
|
8
|
+
def self.build(data, form, mapping=nil)
|
9
|
+
mapping ||= self.mapping(data, form)
|
10
|
+
instance = new data, form, mapping
|
11
|
+
instance
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.mapping(data, form)
|
15
|
+
mapping = {}
|
16
|
+
data.attribute_names.each do |attribute_name|
|
17
|
+
data_attribute, form_attribute = map attribute_name, form
|
18
|
+
mapping[data_attribute] = form_attribute if form_attribute
|
19
|
+
end
|
20
|
+
mapping
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.map(attribute_name, form)
|
24
|
+
setter = "#{attribute_name}="
|
25
|
+
return nil unless form.respond_to? setter
|
26
|
+
|
27
|
+
return attribute_name, attribute_name
|
28
|
+
end
|
29
|
+
|
30
|
+
def !
|
31
|
+
mapping.each do |data_attribute, form_attribute|
|
32
|
+
copy data_attribute, form_attribute
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def copy(data_attribute, form_attribute)
|
37
|
+
value = data.attributes[data_attribute]
|
38
|
+
form.send "#{form_attribute}=", value
|
39
|
+
return value, data_attribute, form_attribute
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module TestAbstractions
|
2
|
+
module Form
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, Client::Accessor
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_accessor :evidence
|
9
|
+
attr_accessor :fields
|
10
|
+
|
11
|
+
def actuate
|
12
|
+
element = client.find actuator
|
13
|
+
raise "Element #{actuator} not found" unless element
|
14
|
+
actuating! if respond_to? :actuating!
|
15
|
+
element.click
|
16
|
+
actuated! if respond_to? :actuated!
|
17
|
+
evidence
|
18
|
+
end
|
19
|
+
alias :! :actuate
|
20
|
+
|
21
|
+
def fill(data, filler=nil)
|
22
|
+
filler ||= Filler.build data, self
|
23
|
+
filler.!
|
24
|
+
filler
|
25
|
+
end
|
26
|
+
|
27
|
+
def open
|
28
|
+
client.open uri
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
def build(evidence_class: nil, fields_class: nil, client: nil)
|
33
|
+
client ||= Client.instance
|
34
|
+
instance = new
|
35
|
+
instance.client = client
|
36
|
+
instance.fields = fields(fields_class, client)
|
37
|
+
instance.evidence = evidence(evidence_class, client)
|
38
|
+
instance
|
39
|
+
end
|
40
|
+
|
41
|
+
def fields(fields_class, client)
|
42
|
+
fields_class ||= self.fields_class
|
43
|
+
|
44
|
+
fields = nil
|
45
|
+
fields = fields_class.build client if fields_class
|
46
|
+
fields
|
47
|
+
end
|
48
|
+
|
49
|
+
def fields_class
|
50
|
+
cls = nil
|
51
|
+
cls = Object.const_get fields_class_name if fields_class?
|
52
|
+
cls
|
53
|
+
end
|
54
|
+
|
55
|
+
def fields_class?
|
56
|
+
Object.const_defined? fields_class_name
|
57
|
+
end
|
58
|
+
|
59
|
+
def fields_class_name
|
60
|
+
"#{self.name}::Fields"
|
61
|
+
end
|
62
|
+
|
63
|
+
def evidence(evidence_class, client)
|
64
|
+
evidence_class ||= self.evidence_class
|
65
|
+
|
66
|
+
evidence = nil
|
67
|
+
evidence = evidence_class.build client if evidence_class
|
68
|
+
evidence
|
69
|
+
end
|
70
|
+
|
71
|
+
def evidence_class
|
72
|
+
cls = nil
|
73
|
+
cls = Object.const_get evidence_class_name if evidence_class?
|
74
|
+
cls
|
75
|
+
end
|
76
|
+
|
77
|
+
def evidence_class?
|
78
|
+
Object.const_defined? evidence_class_name
|
79
|
+
end
|
80
|
+
|
81
|
+
def evidence_class_name
|
82
|
+
class_name = self.name
|
83
|
+
class_name.gsub! '::Form', '::Evidence'
|
84
|
+
end
|
85
|
+
|
86
|
+
def actuator_macro(selector)
|
87
|
+
ActuatorMacro.define self, selector
|
88
|
+
end
|
89
|
+
alias :actuator :actuator_macro
|
90
|
+
|
91
|
+
def uri_macro(uri)
|
92
|
+
URIMacro.define self, uri
|
93
|
+
end
|
94
|
+
alias :uri :uri_macro
|
95
|
+
end
|
96
|
+
|
97
|
+
class ActuatorMacro
|
98
|
+
include Initializer
|
99
|
+
|
100
|
+
initializer :cls, :selector
|
101
|
+
|
102
|
+
def self.define(cls, selector)
|
103
|
+
macro = new cls, selector
|
104
|
+
macro.define
|
105
|
+
macro
|
106
|
+
end
|
107
|
+
|
108
|
+
def define
|
109
|
+
getter
|
110
|
+
setter
|
111
|
+
end
|
112
|
+
|
113
|
+
def getter
|
114
|
+
sel = selector
|
115
|
+
cls.send :define_method, :actuator do
|
116
|
+
sel
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def setter
|
121
|
+
cls.send :define_method, :actuator= do |selector|
|
122
|
+
instance_variable_set :@actuator, selector
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class URIMacro
|
128
|
+
include Initializer
|
129
|
+
|
130
|
+
initializer :cls, :uri
|
131
|
+
|
132
|
+
def self.define(cls, uri)
|
133
|
+
macro = new cls, uri
|
134
|
+
macro.define
|
135
|
+
macro
|
136
|
+
end
|
137
|
+
|
138
|
+
def define
|
139
|
+
getter
|
140
|
+
setter
|
141
|
+
end
|
142
|
+
|
143
|
+
def getter
|
144
|
+
u = uri
|
145
|
+
cls.send :define_method, :uri do
|
146
|
+
u
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def setter
|
151
|
+
cls.send :define_method, :uri= do |uri|
|
152
|
+
instance_variable_set :@uri, uri
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'ruby_version'
|
2
|
+
minimim_supported_ruby_version = '2.1.0'
|
3
|
+
raise "Ruby #{RUBY_VERSION} isn't supported. Ruby must be at least version #{minimim_supported_ruby_version}." unless RubyVersion >= minimim_supported_ruby_version
|
4
|
+
|
5
|
+
require 'uri'
|
6
|
+
require 'capybara'
|
7
|
+
require 'capybara/dsl'
|
8
|
+
require 'capybara/poltergeist'
|
9
|
+
require 'virtus'
|
10
|
+
require 'initializer'
|
11
|
+
|
12
|
+
require 'test_abstractions/client'
|
13
|
+
require 'test_abstractions/configuration'
|
14
|
+
require 'test_abstractions/context'
|
15
|
+
require 'test_abstractions/entity'
|
16
|
+
require 'test_abstractions/evidence'
|
17
|
+
require 'test_abstractions/fields'
|
18
|
+
require 'test_abstractions/filler'
|
19
|
+
require 'test_abstractions/form'
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: test_abstractions
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Scott Bellware
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: capybara
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: selenium-webdriver
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: poltergeist
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: initializer
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: require_all
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: ruby_version
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: virtus
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description:
|
112
|
+
email:
|
113
|
+
executables: []
|
114
|
+
extensions: []
|
115
|
+
extra_rdoc_files: []
|
116
|
+
files:
|
117
|
+
- lib/test_abstractions.rb
|
118
|
+
- lib/test_abstractions/client.rb
|
119
|
+
- lib/test_abstractions/configuration.rb
|
120
|
+
- lib/test_abstractions/context.rb
|
121
|
+
- lib/test_abstractions/entity.rb
|
122
|
+
- lib/test_abstractions/evidence.rb
|
123
|
+
- lib/test_abstractions/fields.rb
|
124
|
+
- lib/test_abstractions/filler.rb
|
125
|
+
- lib/test_abstractions/form.rb
|
126
|
+
homepage: https://github.com/sbellware/test_abstractions
|
127
|
+
licenses:
|
128
|
+
- MIT
|
129
|
+
metadata: {}
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2'
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
requirements: []
|
145
|
+
rubyforge_project:
|
146
|
+
rubygems_version: 2.2.0
|
147
|
+
signing_key:
|
148
|
+
specification_version: 4
|
149
|
+
summary: Test Abstractions Library
|
150
|
+
test_files: []
|