test_abstractions 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []