prism_checker 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e55ec26c33a01af9cbf3ee83a44f2783ac8d705a2242e61b846849b9fe6c9aa1
4
- data.tar.gz: 6051a1b77adf701a0919c89b2944a0eaab17c2f1e2ce470b7c2da2e3c9029866
3
+ metadata.gz: 708e7858706b3dec7fcdd0afb12ffc69eec006e437c9bedbd510352dc7658b78
4
+ data.tar.gz: d89e926e401368026a7c352277362f24a409d499e34e24cdfecd528cc28ae321
5
5
  SHA512:
6
- metadata.gz: '09dd611da901d32afd18acf6cdd8c85a3afe45d95c7c7727f8981451e16907cb08f200a025d0901734390c802eef1ddc2bc089f3eca5e6d7be7876bf8b12f3f2'
7
- data.tar.gz: feef9d1a6cdca2a4e802fd12b444c92514cb886393cabb6a47298fcb6153d2ea352edcccf576d9e764211e8ac1eb774b81e6893a4e244103ac1e74a864dff2c2
6
+ metadata.gz: c6694745c00973b6322191ec17e5ca6eb60d3b96a131053772873e8734537094b90b2062bf0e03aa6c0ae3b0c643fb8742f67668ca6b8204f4ec75f4a539b4cf
7
+ data.tar.gz: 555b76320684d68546ae2cba93920046c2de58083a69c17d67d9e8532558d561dd9d50b964556628cc7b18780d4b45d9a22646b73a9660d3a8852ef78eaf1917
data/README.md CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
  ## Overview
6
6
 
7
- Prism checker - short and easy-to-read browser tests with clear error messages.
8
- Prism checker - extensions for rspec and minitest, built on top of the site_prism gem and uses its Page Object Model.
7
+ PrismChecker is an extension for rspec and minitest, built on top of the [SitePrism](https://github.com/site-prism/site_prism)
8
+ gem and using its page object model.
9
+ It allows you to write short, easy-to-read browser tests with clear error messages
9
10
 
10
- For example, we need to test the online shop cart:
11
+ Let's assume your application has the following shop cart:
11
12
 
12
13
  ![Cart](doc/images/cart.png "Cart")
13
14
 
14
- Corresponding SitePrism Page Object Model:
15
+ Corresponding SitePrism PDO::
15
16
 
16
17
  ```ruby
17
18
  class Cart < SitePrism::Page
@@ -107,9 +108,6 @@ In case of errors, an easy-to-read message will be displayed:
107
108
 
108
109
  ![Result](doc/images/result.png "Result")
109
110
 
110
- **Note.**
111
- _All examples are for rsepc, for mintest it will be the same, but instead of expect(page).be_like(expectation) it will be assert_page_like(page, expectation)_
112
-
113
111
  ## Install
114
112
  To install PrismChecker:
115
113
 
@@ -148,7 +146,7 @@ end
148
146
  ```
149
147
 
150
148
 
151
- #### Check text on the page
149
+ #### Text check
152
150
 
153
151
  ```ruby
154
152
  @page = Cart.new
@@ -158,11 +156,11 @@ expect(page).to be_like('Shopping Cart')
158
156
 
159
157
  # Same as
160
158
  # expect(page.loaded?).to eq(true)
161
- # expect(page).to match('Shopping Cart')
159
+ # expect(page.text).to match('Shopping Cart')
162
160
  ```
163
161
 
164
162
 
165
- #### Check element and section
163
+ #### Element and section check
166
164
 
167
165
  ```ruby
168
166
  @page = Cart.new
@@ -188,7 +186,7 @@ expect(page).to be_like(
188
186
  ```
189
187
 
190
188
 
191
- #### Check element
189
+ #### Element check
192
190
 
193
191
  ```ruby
194
192
  @page = Cart.new
@@ -217,7 +215,7 @@ expect(page).to be_like(header: 'Shopping Cart')
217
215
  ```
218
216
 
219
217
 
220
- #### Check section
218
+ #### Section check
221
219
 
222
220
  ```ruby
223
221
  expect(page.checkout).to be_like(
@@ -250,7 +248,7 @@ expect(page).to be_like(
250
248
  ```
251
249
 
252
250
 
253
- #### Check sections
251
+ #### Sections check
254
252
 
255
253
  ```ruby
256
254
  expect(page).to be_like(
@@ -305,7 +303,7 @@ expect(page).to be_like(cart_items: [{name: 'Cup'}, {name: 'Cap'}]) # Ok
305
303
  ```
306
304
 
307
305
 
308
- #### Check elements
306
+ #### Elements check
309
307
 
310
308
  ```ruby
311
309
  expect(page).to be_like(
@@ -660,7 +658,6 @@ When the comparison method is :inclusion, and it is necessary to compare with an
660
658
  expect(page.element_without_text).to be_like(:empty)
661
659
 
662
660
  # Same as
663
- # expect(page.element_without_text.visible?).to eq(true)
664
661
  # expect(page.element_without_text.text.empty?).to eq(true)
665
662
  ```
666
663
  or
@@ -17,45 +17,44 @@ require_relative 'node/bad_expectation'
17
17
 
18
18
  module PrismChecker
19
19
  class CheckDispatcher
20
- @check_map = {
20
+ COMMON_ELEMENT_CHECKERS = {
21
+ string: [ItemChecker::Element::Visible, ItemChecker::Element::String],
22
+ empty: [ItemChecker::Element::Empty],
23
+ regexp: [ItemChecker::Element::Visible, ItemChecker::Element::Regexp],
24
+ hash: [ItemChecker::Element::Visible],
25
+ visible: [ItemChecker::Element::Visible],
26
+ invisible: [ItemChecker::Element::Invisible]
27
+ }.freeze
28
+
29
+ COMMON_ELEMENTS_CHECKERS = {
30
+ string: [ItemChecker::Elements::String],
31
+ empty: [ItemChecker::Elements::Empty],
32
+ regexp: [ItemChecker::Elements::Regexp],
33
+ array: [ItemChecker::Elements::Array],
34
+ number: [ItemChecker::Elements::Number]
35
+ }.freeze
36
+
37
+ COMMON_INPUT_CHECKERS = {
38
+ string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
39
+ empty: [ItemChecker::Element::Visible, ItemChecker::Input::Empty],
40
+ regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
41
+ hash: [ItemChecker::Element::Visible],
42
+ visible: [ItemChecker::Element::Visible],
43
+ invisible: [ItemChecker::Element::Invisible]
44
+ }.freeze
45
+
46
+ CHECK_MAP = {
21
47
  page: {
22
48
  string: [ItemChecker::Page::Loaded, ItemChecker::Page::String],
23
49
  regexp: [ItemChecker::Page::Loaded, ItemChecker::Page::Regexp],
24
50
  hash: [ItemChecker::Page::Loaded]
25
51
  },
26
52
 
27
- section: {
28
- string: [ItemChecker::Element::Visible, ItemChecker::Element::String],
29
- empty: [ItemChecker::Element::Visible, ItemChecker::Element::Empty],
30
- regexp: [ItemChecker::Element::Visible, ItemChecker::Element::Regexp],
31
- hash: [ItemChecker::Element::Visible],
32
- visible: [ItemChecker::Element::Visible],
33
- invisible: [ItemChecker::Element::Invisible]
34
- },
53
+ section: COMMON_ELEMENT_CHECKERS,
54
+ element: COMMON_ELEMENT_CHECKERS,
35
55
 
36
- sections: {
37
- string: [ItemChecker::Elements::String],
38
- regexp: [ItemChecker::Elements::Regexp],
39
- array: [ItemChecker::Elements::Array],
40
- number: [ItemChecker::Elements::Number]
41
- },
42
-
43
- element: {
44
- string: [ItemChecker::Element::Visible, ItemChecker::Element::String],
45
- empty: [ItemChecker::Element::Visible, ItemChecker::Element::Empty],
46
- regexp: [ItemChecker::Element::Visible, ItemChecker::Element::Regexp],
47
- hash: [ItemChecker::Element::Visible],
48
- visible: [ItemChecker::Element::Visible],
49
- invisible: [ItemChecker::Element::Invisible]
50
- },
51
-
52
- elements: {
53
- string: [ItemChecker::Elements::String],
54
- empty: [ItemChecker::Elements::Empty],
55
- regexp: [ItemChecker::Elements::Regexp],
56
- array: [ItemChecker::Elements::Array],
57
- number: [ItemChecker::Elements::Number]
58
- },
56
+ sections: COMMON_ELEMENTS_CHECKERS,
57
+ elements: COMMON_ELEMENTS_CHECKERS,
59
58
 
60
59
  image: {
61
60
  string: [ItemChecker::Element::Visible, ItemChecker::Image::String],
@@ -65,43 +64,20 @@ module PrismChecker
65
64
  invisible: [ItemChecker::Element::Invisible]
66
65
  },
67
66
 
68
- input: {
69
- string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
70
- empty: [ItemChecker::Element::Visible, ItemChecker::Input::Empty],
71
- regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
72
- hash: [ItemChecker::Element::Visible],
73
- visible: [ItemChecker::Element::Visible],
74
- invisible: [ItemChecker::Element::Invisible]
75
- },
76
-
77
- textarea: {
78
- string: [ItemChecker::Element::Visible, ItemChecker::Textarea::String],
79
- empty: [ItemChecker::Element::Visible, ItemChecker::Textarea::Empty],
80
- regexp: [ItemChecker::Element::Visible, ItemChecker::Textarea::Regexp],
81
- hash: [ItemChecker::Element::Visible],
82
- visible: [ItemChecker::Element::Visible],
83
- invisible: [ItemChecker::Element::Invisible]
84
- },
67
+ input: COMMON_INPUT_CHECKERS,
68
+ textarea: COMMON_INPUT_CHECKERS,
69
+ select: COMMON_INPUT_CHECKERS,
85
70
 
86
- select: {
71
+ radio: {
87
72
  string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
88
- empty: [ItemChecker::Element::Visible, ItemChecker::Input::Empty],
89
73
  regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
90
- hash: [ItemChecker::Element::Visible],
91
- visible: [ItemChecker::Element::Visible],
92
- invisible: [ItemChecker::Element::Invisible]
93
- },
94
-
95
- checkbox: {
96
74
  hash: [ItemChecker::Element::Visible],
97
75
  visible: [ItemChecker::Element::Visible],
98
76
  invisible: [ItemChecker::Element::Invisible],
99
77
  boolean: [ItemChecker::Element::Visible, ItemChecker::Checkbox::Boolean]
100
78
  },
101
79
 
102
- radio: {
103
- string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
104
- regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
80
+ checkbox: {
105
81
  hash: [ItemChecker::Element::Visible],
106
82
  visible: [ItemChecker::Element::Visible],
107
83
  invisible: [ItemChecker::Element::Invisible],
@@ -109,8 +85,9 @@ module PrismChecker
109
85
  },
110
86
 
111
87
  array: {
88
+ array: [ItemChecker::Array::Array],
112
89
  string: [ItemChecker::Array::String],
113
- empty: [ItemChecker::Array::String],
90
+ empty: [ItemChecker::Array::Empty],
114
91
  regexp: [ItemChecker::Array::Regexp],
115
92
  number: [ItemChecker::Elements::Number]
116
93
  },
@@ -119,8 +96,9 @@ module PrismChecker
119
96
  boolean: [ItemChecker::Any::Any]
120
97
  },
121
98
 
122
- number: {
123
- number: [ItemChecker::Any::Any]
99
+ other: {
100
+ number: [ItemChecker::Any::Any],
101
+ other: [ItemChecker::Any::Any]
124
102
  },
125
103
 
126
104
  string: {
@@ -133,12 +111,12 @@ module PrismChecker
133
111
  string: [ItemChecker::Nil::String],
134
112
  regexp: [ItemChecker::Nil::Regexp]
135
113
  }
136
- }
114
+ }.freeze
137
115
 
138
116
  def self.checkers(_node, element, expectation, item_type)
139
117
  expectation_type = ExpectationClassifier.classify(expectation)
140
118
 
141
- element_expectations = @check_map[item_type]
119
+ element_expectations = CHECK_MAP[item_type]
142
120
 
143
121
  raise_bad_element(element) unless element_expectations
144
122
 
@@ -159,10 +137,5 @@ module PrismChecker
159
137
  error = "Don't know how to compare #{element_class} with #{expectation.class.name}"
160
138
  raise Node::BadExpectation, error
161
139
  end
162
-
163
- def self.add(element_type, check_type, checks)
164
- @check_map[element_type] ||= {}
165
- @check_map[element_type][check_type] = checks
166
- end
167
140
  end
168
141
  end
@@ -19,24 +19,18 @@ module PrismChecker
19
19
  def check(item, expectation)
20
20
  prepare(item, expectation)
21
21
 
22
+ # rubocop:disable Style/SymbolProc
23
+ # rubocop is wrong
22
24
  walk_through do |node|
23
25
  node.check
24
26
  end
27
+ # rubocop:enable Style/SymbolProc
25
28
 
26
29
  @result = true
27
30
  rescue Node::CheckFail
28
- # puts report
29
31
  @result = false
30
- # rescue Node::BadExpectation => e
31
- # # raise
32
- # raise e.class, report + "\n" + e.message
33
32
  rescue StandardError => e
34
- # puts '---------------------'
35
- # puts e.class
36
- # puts e.message
37
- # pp e.backtrace
38
- # puts '---------------------'
39
- raise e.class, report + "\n" + e.message
33
+ raise e.class, "#{report}\n#{e.message}"
40
34
  end
41
35
 
42
36
  def report
@@ -37,15 +37,9 @@ module PrismChecker
37
37
  return @element.send(method, *args)
38
38
  end
39
39
 
40
- # if (ItemClassifier.element_checkbox?(@element) || ItemClassifier.element_radio?(@element)) && method == :checked
41
- # return @element.checked?
42
- # end
43
-
44
40
  ret = @element[method]
45
41
 
46
42
  if ret.nil? && !method.start_with?('data-')
47
- # return '' if method.start_with?('data-')
48
-
49
43
  raise NoMethodError, "unknown attribute '#{method}'"
50
44
  end
51
45
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module PrismChecker
4
4
  class ExpectationClassifier
5
- @expectations_map = [
5
+ EXPECTATIONS_MAP = [
6
6
  %i[invisible invisible?],
7
7
  %i[visible visible?],
8
8
  %i[empty empty?],
@@ -12,17 +12,12 @@ module PrismChecker
12
12
  %i[hash hash?],
13
13
  %i[boolean boolean?],
14
14
  %i[number number?]
15
- ]
15
+ ].freeze
16
16
 
17
17
  def self.classify(expectation)
18
- @expectations_map.each do |data|
19
- type = data[0]
20
- probe = data[1]
21
- if probe.is_a? Symbol
22
- return type if send(probe, expectation)
23
- elsif probe.call(expectation)
24
- return type
25
- end
18
+ EXPECTATIONS_MAP.each do |data|
19
+ type, probe = data
20
+ return type if send(probe, expectation)
26
21
  end
27
22
 
28
23
  :other
@@ -63,9 +58,5 @@ module PrismChecker
63
58
  def self.number?(expectation)
64
59
  expectation.is_a?(Integer)
65
60
  end
66
-
67
- def self.add(type, probe, position = 0)
68
- @expectations_map.insert(position, [type, probe])
69
- end
70
61
  end
71
62
  end
@@ -3,11 +3,20 @@
3
3
  require_relative 'item_check/string'
4
4
  require_relative 'item_check/regexp'
5
5
  require_relative 'item_check/empty_array'
6
+ require_relative 'item_check/array'
6
7
  require_relative 'item_value/array'
7
8
 
8
9
  module PrismChecker
9
10
  module ItemChecker
10
11
  module Array
12
+ class Array
13
+ def self.value(elements)
14
+ elements
15
+ end
16
+
17
+ extend ItemCheck::Array
18
+ end
19
+
11
20
  class String
12
21
  extend ItemValue::Array
13
22
  extend ItemCheck::String
@@ -16,7 +16,7 @@ module PrismChecker
16
16
  value == expectation
17
17
  end
18
18
 
19
- def self.error_message(_checkbox, value, expectation)
19
+ def self.error_message(_checkbox, _value, expectation)
20
20
  if expectation
21
21
  'Expected to be checked'
22
22
  else
@@ -8,7 +8,6 @@ require_relative 'item_check/empty'
8
8
  module PrismChecker
9
9
  module ItemChecker
10
10
  module Element
11
-
12
11
  class String
13
12
  extend ItemValue::Element
14
13
  extend ItemCheck::String
@@ -25,7 +24,9 @@ module PrismChecker
25
24
  end
26
25
 
27
26
  class Visible
28
- def self.value(_element); end
27
+ def self.value(element)
28
+ element
29
+ end
29
30
 
30
31
  def self.check(element, _value, _expectation)
31
32
  element.visible?
@@ -43,10 +43,12 @@ module PrismChecker
43
43
 
44
44
  class Empty
45
45
  def self.value(elements)
46
- elements
46
+ elements.map(&:text).join
47
47
  end
48
48
 
49
- extend ItemCheck::EmptyArray
49
+ def self.check(_elements, value, _expectation)
50
+ value.empty?
51
+ end
50
52
  end
51
53
  end
52
54
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrismChecker
4
+ module ItemChecker
5
+ module ItemCheck
6
+ module Array
7
+ def check(_element, value, expectation)
8
+ value.size == expectation.size
9
+ end
10
+
11
+ def error_message(elements, _value, expectation)
12
+ "Wrong elements count\nActual: #{elements.size}\nExpected: #{expectation.size}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'site_prism'
4
+ require 'capybara'
5
+
3
6
  module PrismChecker
4
7
  class ItemClassifier
5
- @elements_map = [
8
+ ELEMENTS_MAP = [
6
9
  %i[checkbox element_checkbox?],
7
10
  %i[radio element_radio?],
8
11
  %i[input element_input?],
@@ -18,17 +21,12 @@ module PrismChecker
18
21
  %i[string string?],
19
22
  %i[boolean boolean?],
20
23
  %i[nil element_nil?]
21
- ]
24
+ ].freeze
22
25
 
23
26
  def self.classify(element)
24
- @elements_map.each do |data|
25
- type = data[0]
26
- probe = data[1]
27
- if probe.is_a? Symbol
28
- return type if send(probe, element)
29
- elsif probe.call(element)
30
- return type
31
- end
27
+ ELEMENTS_MAP.each do |data|
28
+ type, probe = data
29
+ return type if send(probe, element)
32
30
  end
33
31
 
34
32
  :other
@@ -118,9 +116,5 @@ module PrismChecker
118
116
  def self.element_nil?(element)
119
117
  element.nil?
120
118
  end
121
-
122
- def self.add(type, probe, position = 0)
123
- @elements_map.insert(position, [type, probe])
124
- end
125
119
  end
126
120
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'capybara'
3
4
  require_relative 'check_fail'
4
5
  require_relative 'bad_expectation'
5
6
  require_relative '../element_wrapper'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prism_checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ganglion-17
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-30 00:00:00.000000000 Z
11
+ date: 2024-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: site_prism
@@ -16,16 +16,30 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0
19
+ version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.0
26
+ version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '11.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '11.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -44,14 +58,14 @@ dependencies:
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '3.10'
61
+ version: '3.1'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '3.10'
68
+ version: '3.1'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -156,36 +170,8 @@ dependencies:
156
170
  - - "~>"
157
171
  - !ruby/object:Gem::Version
158
172
  version: '4.6'
159
- - !ruby/object:Gem::Dependency
160
- name: ruby-prof
161
- requirement: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- version: '0'
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - ">="
171
- - !ruby/object:Gem::Version
172
- version: '0'
173
- - !ruby/object:Gem::Dependency
174
- name: dotenv
175
- requirement: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- version: '0'
180
- type: :development
181
- prerelease: false
182
- version_requirements: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - ">="
185
- - !ruby/object:Gem::Version
186
- version: '0'
187
173
  description: |
188
- Prism checker is an extension for rspec and minitest, built on top of the SitePrism gem and using its page object model.
174
+ prism_checker is an extension for rspec and minitest, built on top of the site_prism gem and using its page object model.
189
175
  It allows you to write short, easy-to-read browser tests with clear error messages
190
176
  email:
191
177
  - ganglion1717@gmail.com
@@ -210,6 +196,7 @@ files:
210
196
  - lib/prism_checker/item_checker/elements.rb
211
197
  - lib/prism_checker/item_checker/image.rb
212
198
  - lib/prism_checker/item_checker/input.rb
199
+ - lib/prism_checker/item_checker/item_check/array.rb
213
200
  - lib/prism_checker/item_checker/item_check/empty.rb
214
201
  - lib/prism_checker/item_checker/item_check/empty_array.rb
215
202
  - lib/prism_checker/item_checker/item_check/number.rb