test_abstractions 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|