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 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,11 @@
1
+ module TestAbstractions
2
+ module Entity
3
+ def self.included(descendant)
4
+ descendant.send(:include, Virtus.model)
5
+ end
6
+
7
+ def attribute_names
8
+ attributes.keys
9
+ end
10
+ end
11
+ 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: []